2009-06-30 4 views
88

Я столкнулся с проблемой при тестировании своих контроллеров с RSpec - вызов response.body всегда возвращает пустую строку. В браузере все отображается правильно, а тесты на огурцы, похоже, все исправляют, но RSpec терпит неудачу каждый раз.Проверка контроллера RSpec - blank response.body

Другие ожидания от объекта ответа, такие как response.should render_template('index'), проходят без проблем.

Неужели кто-нибудь из вас столкнулся с этой проблемой раньше? Возможно, ответ html может быть получен каким-то другим способом?

Что касается версий, Rails 2.1.0, RSpec 1.2.7.

ответ

166

По умолчанию rspec-rails перехватывает Rails до , предотвращает от фактически визуальных шаблонов просмотра. Вы должны только проверять поведение своих действий. & фильтрует ваши тесты контроллера, а не результат рендеринга шаблонов - вот для чего предназначены спецификации.

Однако, если вы хотите, чтобы ваш контроллер функции рендеринга шаблонов, как приложение обычно будет, использовать render_views директиву:

describe YourController do 
    render_views 
    ... 
end 
+2

Спасибо, именно то, что мне было нужно. –

+1

Я работаю с Rails в течение многих лет, и теперь я, наконец, понимаю разницу между контроллерами и спецификациями запросов. Благодаря! –

2

Как я работал с подобной проблемой (что привело меня к этому вопросу), мне пришло в голову, что существуют разные способы кожи одного и того же кота. Другими словами, вместо проверки основного текста вы можете проверить содержимое вспышки.

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

может быть эквивалентно чек на:

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

мне последний кажется немного более гибким, как он будет работать в любом случае, но это не может быть целесообразным во всех случаях.

Приветствия,

Джон

0

По умолчанию конфигурация RSpec рельсы отключает рендеринг шаблонов для спецификации контроллера

Один из способов исправить это, убедившись, чтобы включить параметр render_views в файле rails_helper.rb. Таким образом, вы можете работать в глобальном масштабе во всех своих тестах.

RSpec.configure do |config| 
    config.render_views 
end 

Или использовать render_views декларации индивидуальной группы:

describe User do 
    render_views 
end 

Вы можете прочитать больше об этом here.