Test delle pagine di errore in Rails con Rspec + Capybara

In Rails 3.2.9 ho pagine di errore personalizzate così definite:

# application.rb config.exceptions_app = self.routes # routes.rb match '/404' => 'errors#not_found' 

Che funziona come previsto. Quando imposto config.consider_all_requests_local = false in development.rb ottengo la vista not_found quando not_found /foo

Ma come posso testarlo con Rspec + Capybara?

Ho provato questo:

 # /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 

Quando eseguo questa specifica ottengo:

 1) not found page should respond with 404 page Failure/Error: visit '/foo' ActionController::RoutingError: No route matches [GET] "/foo" 

Come posso testarlo?

Modificare:

Ho dimenticato di menzionare: ho impostato config.consider_all_requests_local = false in test.rb

L’impostazione problematica nel test.rb non è solo la

 consider_all_requests_local = false 

ma anche

 config.action_dispatch.show_exceptions = true 

Se lo imposti dovresti essere in grado di testare l’errore. Non ero in grado di usarlo in un filtro in giro.

Dai un’occhiata a http://agileleague.com/blog/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/

config.consider_all_requests_local = false impostazioni dovrebbero essere impostate in config/environments/test.rb nello stesso modo in cui hai fatto per il tuo sviluppo.

Se non si vuole fare questo per tutti i test, forse un filtro rspec around sarebbe utile per impostare lo stato prima del test e ripristinare successivamente in questo modo:

 # /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 

Se vuoi farlo e non vuoi cambiare config/environments/test.rb , puoi seguire la soluzione da questo post .

Con Rails 5.2, Capybara 3 sono stato in grado di simulare errori di pagina con il seguente

 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 

Aggiornare

Questo sembra non funzionare sempre quando si esegue l’intera suite di test. Quindi ho dovuto impostare config.action_dispatch.show_exceptions = true in config/environments/test.rb e rimuovere il blocco intorno.