Testowanie kontrolera RSpec - puste ciało odpowiedzi

103

Utknąłem z problemem podczas testowania moich kontrolerów za pomocą RSpec - wywołanie response.body zawsze zwraca pusty ciąg. W przeglądarce wszystko renderuje się poprawnie, a testy funkcji ogórka wydają się działać poprawnie, ale RSpec za każdym razem zawodzi.

Inne oczekiwania dotyczące obiektu odpowiedzi, takie jak response.should render_template('index')przejście bez żadnych problemów.

Czy ktoś z was napotkał wcześniej ten problem? Może odpowiedź html można uzyskać w inny sposób?

Jeśli chodzi o wersje, Rails 2.1.0, RSpec 1.2.7.

Toms Mikoss
źródło

Odpowiedzi:

195

Domyślnie rspec-rails włamuje się do Railsów, aby uniemożliwić mu rzeczywiste renderowanie szablonów widoku. Powinieneś testować tylko zachowanie swoich akcji i filtrów testów kontrolera, a nie wynik renderowania szablonu - do tego służą specyfikacje widoku.

Jeśli jednak chcesz, aby specyfikacje kontrolera renderowały szablony tak, jak normalnie robiłaby to aplikacja, użyj render_viewsdyrektywy:

describe YourController do
  render_views
  ...
end
mislav
źródło
2
Dziękuję, dokładnie to, czego potrzebowałem.
Toms Mikoss
2
Pracuję z Railsami od lat i teraz wreszcie rozumiem różnicę między specyfikacją kontrolera a specyfikacją żądań. Dzięki!
Brian Underwood
2

Kiedy pracowałem z podobnym problemem (który doprowadził mnie do tego pytania), przyszło mi do głowy, że istnieją różne sposoby skórowania tego samego kota. Innymi słowy, zamiast sprawdzać tekst podstawowy, możesz być w stanie sprawdzić zawartość flasha.

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

może być równoważnym czekiem:

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

Wydaje mi się, że ta ostatnia wydaje się nieco bardziej elastyczna, ponieważ będzie działać w obie strony, ale może nie być odpowiednia we wszystkich przypadkach.

Twoje zdrowie,

Jan

John Lockwood
źródło
2

Domyślnie konfiguracja RSpec-rails wyłącza renderowanie szablonów specyfikacji kontrolera

Jednym ze sposobów rozwiązania tego problemu jest włączenie tego render_viewsustawienia w rails_helper.rbpliku. W ten sposób sprawisz, że będzie on działał globalnie we wszystkich testach.

RSpec.configure do |config|
  config.render_views
end

Lub użyj deklaracji render_views dla indywidualnej grupy:

describe User do
  render_views
end

Możesz przeczytać więcej na ten temat tutaj .

Nesha Zoric
źródło