Тестування контролера RSpec - порожній response.body


103

У мене виникає проблема при тестуванні моїх контролерів за допомогою RSpec - виклик response.body завжди повертає порожню рядок. У веб-переглядачі все відображається правильно, і тести з огірками, здається, справляються правильно, але RSpec виходить з ладу кожен раз.

Інші очікування на об'єкт відповіді, такі як response.should render_template('index')пропуск без проблем.

Хтось із вас раніше стикався з цією проблемою? Можливо, відповідь html можна отримати іншим способом?

Що стосується версій, Rails 2.1.0, RSpec 1.2.7.

Відповіді:


194

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

Однак якщо ви хочете змусити ваші контролери специфікувати шаблони як звичайні програми, скористайтеся render_viewsдирективою:

describe YourController do
  render_views
  ...
end

2
Дякую, саме те, що мені було потрібно.
Томс Мікосс

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

Більше про це можна прочитати тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.