it-roy-ru.com

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

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

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

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

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

96
Toms Mikoss

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

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

describe YourController do
  render_views
  ...
end
179
mislav

RSpec 2+: Если вы хотите проверить сквозную ссылку в теле ответа - используйте запросить спецификацию вместо спецификация контроллера .

3
Thomas

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

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

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

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

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

Ура,

Джон

2
John Lockwood

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

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

RSpec.configure do |config|
  config.render_views
end

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

describe User do
  render_views
end

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

1
Nesha Zoric