Тестирование страниц ошибок в Rails с Rspec + Capybara
В Rails 3.2.9 У меня есть страницы с настраиваемой ошибкой, например:
# application.rb
config.exceptions_app = self.routes
# routes.rb
match '/404' => 'errors#not_found'
Что работает, как ожидалось. Когда я устанавливаю config.consider_all_requests_local = false
в development.rb
, я получаю представление not_found
при посещении /foo
Но как я могу проверить это с помощью Rspec + Capybara?
Я пробовал это:
# /spec/features/not_found_spec.rb
require 'spec_helper'
describe 'not found page' do
it 'should respond with 404 page' do
visit '/foo'
page.should have_content('not found')
end
end
Когда я запускаю эту спецификацию, я получаю:
1) not found page should respond with 404 page
Failure/Error: visit '/foo'
ActionController::RoutingError:
No route matches [GET] "/foo"
Как я могу проверить это?
Edit:
Забыл упомянуть: я установил config.consider_all_requests_local = false
в test.rb
Ответы
Ответ 1
Проблемная настройка в test.rb - это не только
consider_all_requests_local = false
но также
config.action_dispatch.show_exceptions = true
Если вы установите это значение, вы сможете проверить ошибку.
Я не смог использовать его в фильтрах вокруг.
Ищите http://agileleague.com/blog/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/
Ответ 2
параметр config.consider_all_requests_local = false
должен быть установлен в config/environments/test.rb
так же, как вы сделали для своей разработки.
Если вы не хотите делать это для всех тестов, возможно, rspec вокруг фильтра было бы полезно установить состояние перед тестом и восстановить после этого так:
# /spec/features/not_found_spec.rb
require 'spec_helper'
describe 'not found page' do
around :each do |example|
Rails.application.config.consider_all_requests_local = false
example.run
Rails.application.config.consider_all_requests_local = true
end
it 'should respond with 404 page' do
visit '/foo'
page.should have_content('not found')
end
end
Ответ 3
Если вы хотите сделать это и не хотите менять config/environments/test.rb
, вы можете выполнить это решение из .
Ответ 4
С Rails 5.2, Capybara 3 мне удалось смоделировать ошибки страницы со следующими
around do |example|
Rails.application.config.action_dispatch.show_exceptions = true
example.run
Rails.application.config.action_dispatch.show_exceptions = false
end
before do
allow(Person).to receive(:search).and_raise 'App error simulation!'
end
it 'displays an error message' do
visit root_path
fill_in 'q', with: 'anything'
click_on 'Search'
expect(page).to have_content 'We are sorry, but the application encountered a problem.'
end
Обновить
Кажется, это не всегда работает при запуске полного набора тестов. Поэтому мне пришлось установить config.action_dispatch.show_exceptions = true
в config/environments/test.rb
и удалить блок config/environments/test.rb
.
Ответ 5
Вы можете получить доступ непосредственно к странице ошибки 404:
Посетите /404
вместо /foo