2009-06-30 17 views
88

Sono bloccato con un problema durante il test dei miei controller con RSpec - la chiamata response.body restituisce sempre una stringa vuota. Nel browser tutto rende correttamente, e i test di funzionalità di cetriolo sembrano farlo bene, ma RSpec fallisce ogni volta.Test controller RSpec - blank response.body

Altre aspettative sull'oggetto risposta, ad esempio response.should render_template('index'), passano senza problemi.

Qualcuno di voi ha riscontrato questo problema prima? Forse la risposta html può essere ottenuta in qualche altro modo?

Per quanto riguarda le versioni, Rails 2.1.0, RSpec 1.2.7.

risposta

166

Per impostazione predefinita, rspec-rails hack in Rails su impedisce a di rappresentare effettivamente i modelli di visualizzazione. Dovresti testare solo il comportamento delle tue azioni & filtri i test del controller, non il risultato del rendering del modello: ecco a cosa servono le specifiche di visualizzazione.

Tuttavia, se si desidera effettuare le caratteristiche del tuo controller di rendere i modelli come l'applicazione normalmente sarebbe, utilizzare la direttiva render_views:

describe YourController do 
    render_views 
    ... 
end 
+2

Grazie, esattamente ciò di cui avevo bisogno. –

+1

Ho lavorato con Rails per anni e ora capisco finalmente la differenza tra le specifiche del controller e della richiesta. Grazie! –

2

Come ho lavorato con un problema simile (che mi ha portato a questa domanda), mi è venuto in mente che ci sono diversi modi per scuoiare lo stesso gatto. In altre parole, anziché controllare il testo del corpo, potresti essere in grado di controllare il contenuto del flash.

response.body.should =~ /Invalid email or password/ 

potrebbe essere un controllo equivalente a:

flash[:alert].should == "Invalid email or password" 

Per me quest'ultima sembra un po 'più flessibile in quanto verrà eseguito in entrambi i casi, ma non può essere opportuno in tutti i casi.

Cheers,

John

0

Per impostazione predefinita, la configurazione RSpec-rails disattiva il rendering di modelli per le specifiche del controller

Uno dei modi per risolvere questo problema è di fare in modo di attivare l'impostazione render_views nel file rails_helper.rb. In questo modo, puoi farlo funzionare globalmente in tutti i tuoi test.

RSpec.configure do |config| 
    config.render_views 
end 

Oppure utilizzare dichiarazione render_views un singolo gruppo:

describe User do 
    render_views 
end 

Si può leggere di più su questo here.