ruby on rails - rack_test - Prueba de páginas de error en Rails con Rspec+Capybara
ruby on rails selenium (4)
Con Rails 5.2, Capybara 3 pude simular errores de página con lo siguiente
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
Actualizar
Esto parece no funcionar siempre cuando se ejecuta el conjunto de pruebas completo. Así que tuve que configurar config.action_dispatch.show_exceptions = true
en config/environments/test.rb
y eliminar el bloque de entorno.
En Rails 3.2.9 tengo páginas de error personalizadas definidas así:
# application.rb
config.exceptions_app = self.routes
# routes.rb
match ''/404'' => ''errors#not_found''
Que funciona como se esperaba. Cuando configuro config.consider_all_requests_local = false
en development.rb
obtengo la vista not_found
al visitar /foo
Pero, ¿cómo puedo probar esto con Rspec + Capybara?
He intentado esto:
# /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
Cuando ejecuto esta especificación obtengo:
1) not found page should respond with 404 page
Failure/Error: visit ''/foo''
ActionController::RoutingError:
No route matches [GET] "/foo"
¿Cómo puedo probar esto?
Editar:
Olvidé mencionar: He configurado config.consider_all_requests_local = false
en test.rb
El ajuste problemático en el test.rb no es solo el
consider_all_requests_local = false
pero también
config.action_dispatch.show_exceptions = true
Si configura esto debería poder probar el error. No pude usarlo en un filtro alrededor.
La config.consider_all_requests_local = false
debe establecerse en config/environments/test.rb
de la misma manera que lo hizo con su desarrollo.
Si no desea hacer esto para todas las pruebas, tal vez un filtro rspec around sería útil para establecer el estado antes de la prueba y luego restaurar de esta forma:
# /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
Si desea hacerlo y no desea cambiar config/environments/test.rb
, puede seguir la solución de esta post .