2011-10-21 15 views
15

sto avendo problemi a fare due richieste allo stesso URL in un test rotaie integrazione, con RSpecfacendo due richieste allo stesso controller in Rails integrazioni specifiche

it 'does something' do 

    # get '/something', {:status=>'any_other'}, @header ## <<<<< this line couses problem! 

    get '/something', {:status=>'ok'}, @header 
    doc = Nokogiri::HTML(response.body) 
    lis = doc.css('#the_id') 
    lis.size.should == 1 
    lis[0].text.should include('anything') 
end 

Se faccio due richieste allo stesso controller , il test sembra mantenere la vecchia risposta ...

Nel precedente esempio, se io rimuovere il commento che la linea, le interruzioni di prova beacause si mantiene il risultato del primo 'query'

E 'una limitazione di lo stack di test o sto facendo qualcosa di sbagliato?

risposta

1

I test di integrazione delle rotaie devono essere scritti in modo tale che il caso onali verifichi un singolo ciclo di richiesta-risposta. possiamo controllare i reindirizzamenti. ma se si deve fare qualcosa di simile

get '/ qualcosa', {: status => 'any_other'}, @header

get '/ qualcosa', {: status => 'ok'}, @header

Si dovrebbe scrivere due casi diversi per questo.

+4

Se i progettisti di rspec non vogliono di effettuare una seconda richiesta, la seconda richiesta dovrebbe sollevare un'eccezione che impedisca di farlo. In questo modo diventa una caratteristica, non un bug. Qualche idea sul perché non l'abbiano fatto? –

+1

Sì, i progettisti di rspec hanno fornito la funzione. È tuo requisito il modo in cui vuoi testarlo (come per il comportamento effettivo dell'applicazione). –

1

Utilizzo di Capybara anziché rspec è una soluzione migliore per i test di integrazione (richiesta). Utilizza la stessa sintassi di rspec e consente più richieste in un singolo blocco. Io uso rspec per il test delle unità e capibara per i test di integrazione.

1

Con pianura vecchio suite di test Rails, test funzionali sono per singola richiesta e se si desidera verificare i flussi si consiglia di utilizzare i test di integrazione (è possibile ripristinare il controller nei test funzionali).

Le specifiche del controller da rspec-rails ereditano dai test funzionali di Rails, pertanto presentano la stessa limitazione. Puoi usare rspec con capybara o webrat (consiglio il primo) per i test di integrazione.

Inoltre, le versioni recenti di RSpec-rail ha "richiesta specifiche" che "mescolare in behaivour di Rails test di integrazione": https://github.com/rspec/rspec-rails

0

È necessario cancellare le variabili di istanza, o forse l'unico necessario. Facciamo finta di usare @book nel controller.

get '/something' 
assert ... 
controller.instance_variable_set(:@book, nil) 
get '/something' 
assert ... 

Se si utilizza inherit_resources

get '/something' 
assert ... 
controller.send(:set_resource_ivar, nil) 
get '/something' 
assert ... 
+0

Questo non è abbastanza buono. RSpec mantiene i vecchi 'params' in giro, e se passi un nuovo' params' alla tua seconda richiesta, i 'params' che il tuo controller vede possono essere sorprendenti a volte. –

Problemi correlati