Тестирование контроллера RSpec - пустой ответ. Тело

103

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

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

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

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

Томс Микосс
источник

Ответы:

195

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

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

describe YourController do
  render_views
  ...
end
Мислав
источник
2
Спасибо, именно то, что мне было нужно.
Томс Микосс 01
2
Я работал с Rails много лет и теперь наконец понимаю разницу между спецификациями контроллера и запросов. Спасибо!
Брайан Андервуд
2

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

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

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

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

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

Привет,

Джон

Джон Локвуд
источник
2

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

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

RSpec.configure do |config|
  config.render_views
end

Или используйте объявление render_views для отдельной группы:

describe User do
  render_views
end

Вы можете прочитать об этом здесь .

Неша Зорич
источник