2009-06-30 12 views
88

Ich bin mit einem Problem beim Testen meiner Controller mit RSpec fest - der response.body-Aufruf gibt immer eine leere Zeichenfolge zurück. Im Browser wird alles richtig gerendert, und Gurkenfunktionstests scheinen es richtig zu machen, aber RSpec versagt jedes Mal.RSpec Controller testen - blank response.body

Andere Erwartungen an das Antwortobjekt wie response.should render_template('index') bestehen ohne Probleme.

Haben Sie schon einmal auf dieses Problem gestoßen? Vielleicht kann die Antwort HTML auf eine andere Art und Weise erhalten werden?

Wie bei den Versionen, Rails 2.1.0, RSpec 1.2.7.

Antwort

166

Standardmäßig hackt rspec-rails in Rails zu verhindern es von tatsächlich Render-Ansicht Vorlagen. Sie sollten nur das Verhalten Ihrer Aktionen testen & filtert Ihre Controller-Tests, nicht das Ergebnis der Vorlage Rendering - das ist, was View-Spezifikationen sind.

Wenn Sie jedoch Ihre Controller-Spezifikationen machen Vorlagen machen wollen, wie die App würde normalerweise die render_views Direktive verwenden:

describe YourController do 
    render_views 
    ... 
end 
+2

Danke, genau was ich brauchte. –

+1

Ich arbeite seit Jahren mit Rails und jetzt verstehe ich endlich den Unterschied zwischen Controller und Request-Spezifikationen. Vielen Dank! –

2

Wie ich mit einem ähnlichen Problem gearbeitet (das mich zu dieser Frage geführt), es kam mir in den Sinn, dass es verschiedene Möglichkeiten gibt, dieselbe Katze zu häuten. Mit anderen Worten, anstatt nach dem Haupttext zu suchen, können Sie möglicherweise den Inhalt des Flash überprüfen.

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

könnte eine gleichwertige Kontrolle sein:

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

Für mich ist das letztere etwas flexibler ist, als es so oder so laufen wird, aber es kann nicht in allen Fällen angemessen sein.

Cheers,

John

0

standardmäßig RSpec-Schienen-Konfiguration deaktiviert Wiedergabe von Vorlagen für Controller-Spezifikationen

Einer der Wege, dies, indem sichergestellt wird zu beheben, ist die render_views Einstellung in Ihrer rails_helper.rb Datei zu aktivieren. Auf diese Weise können Sie global in allen Ihren Tests arbeiten.

RSpec.configure do |config| 
    config.render_views 
end 

Oder render_views Erklärung eine individuelle Gruppe verwenden:

describe User do 
    render_views 
end 

Sie können mehr über diese here lesen.