RSpec-Controller-Test - leere Antwort

103

Ich habe ein Problem beim Testen meiner Controller mit RSpec - der Aufruf response.body gibt immer eine leere Zeichenfolge zurück. Im Browser wird alles korrekt gerendert, und Gurkenfunktionstests scheinen es richtig zu machen, aber RSpec schlägt jedes Mal fehl.

Andere Erwartungen an das Antwortobjekt, wie z. B. response.should render_template('index')problemlos bestanden.

Hat jemand von Ihnen dieses Problem schon einmal erlebt? Vielleicht kann die Antwort HTML auf eine andere Weise erhalten werden?

Wie für Versionen, Rails 2.1.0, RSpec 1.2.7.

Toms Mikoss
quelle

Antworten:

193

Standardmäßig hackt rspec-Rails in Rails, um zu verhindern , dass Ansichtsvorlagen tatsächlich gerendert werden. Sie sollten nur das Verhalten Ihrer Aktionen und Filter Ihrer Controller-Tests testen, nicht das Ergebnis des Renderns von Vorlagen - dafür sind Ansichtsspezifikationen gedacht.

Wenn Sie jedoch möchten, dass Ihre Controller-Spezifikationen Vorlagen wie die App normalerweise rendern, verwenden Sie die folgende render_viewsAnweisung:

describe YourController do
  render_views
  ...
end
mislav
quelle
2
Danke, genau das, was ich brauchte.
Toms Mikoss
2
Ich arbeite seit Jahren mit Rails und jetzt verstehe ich endlich den Unterschied zwischen Controller- und Anforderungsspezifikationen. Vielen Dank!
Brian Underwood
2

Als ich mit einem ähnlichen Problem arbeitete (das mich zu dieser Frage führte), kam mir der Gedanke, dass es verschiedene Möglichkeiten gibt, dieselbe Katze zu häuten. Mit anderen Worten, anstatt nach dem Text zu suchen, können Sie möglicherweise den Inhalt des Flashs überprüfen.

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

könnte eine äquivalente Prüfung sein zu:

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

Letzteres scheint mir etwas flexibler zu sein, da es in beide Richtungen abläuft, aber möglicherweise nicht in allen Fällen angemessen ist.

Prost,

John

John Lockwood
quelle
2

Standardmäßig deaktiviert die RSpec-Rails-Konfiguration das Rendern von Vorlagen für Controller-Spezifikationen

Eine Möglichkeit, dies zu beheben, besteht darin, die render_viewsEinstellung in Ihrer rails_helper.rbDatei zu aktivieren . Auf diese Weise können Sie in all Ihren Tests global arbeiten.

RSpec.configure do |config|
  config.render_views
end

Oder verwenden Sie die render_views-Deklaration einer einzelnen Gruppe:

describe User do
  render_views
end

Mehr dazu lesen Sie hier .

Nesha Zoric
quelle