Подтвердить что ты не робот

Тестирование страниц ошибок в 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

4b9b3361

Ответ 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