2012-12-21 14 views
22

in Rails 3.2.9 Ho pagine di errore personalizzate definisce in questo modo:pagine di errore di test in Rails con Rspec + Capybara

# application.rb 
config.exceptions_app = self.routes 

# routes.rb 
match '/404' => 'errors#not_found' 

che funziona come previsto. Quando ho impostato config.consider_all_requests_local = false in development.rb ho la vista not_found quando si visita /foo

Ma come faccio a testare questo 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 questo spec ottengo:

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

Come posso provare questo?

Edit:

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

risposta

29

L'impostazione problematica nel test .RB non è solo il

consider_all_requests_local = false 

ma anche

config.action_dispatch.show_exceptions = true 

Se si imposta questo si dovrebbe essere in grado di verificare l'errore. Non ero in grado di usarlo in un filtro intorno.

dare un'occhiata per http://agileleague.com/blog/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/

+0

Grazie, era esattamente quello che mi mancava. Pensavo che il problema fosse più profondo di così, quindi avevo iniziato a scavare intorno a Capybara ... –

+0

Che ne dici di una specifica del controller? Con questi cambiamenti le mie caratteristiche tecniche funzionano bene, ma sto ancora ricevendo il test fallito (con un errore ActiveRecord :: RecordNotFound) in una specifica del controller. C'è qualcosa che devo fare in modo diverso per questi? – robertwbradford

+0

Il collegamento è interrotto ed è ora disponibile all'indirizzo http://agileleague.com/blog/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/ –

0

l'impostazione config.consider_all_requests_local = false avrebbe bisogno di essere impostato in config/environments/test.rb nello stesso modo che avete fatto per il vostro sviluppo uno.

Se non si vuole fare questo per tutte le prove, forse un rspec around filter sarebbe utile per impostare lo stato prima della prova e il ripristino in seguito 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 
+0

Ho dimenticato di dire che ho già provato con l'impostazione di 'consider_all_requests_local = false' in' test.rb'. –

+1

Non funziona per me, purtroppo –

+2

Anche per me, ho ActionController :: RoutingError: – Artur79

1

Se si vuole fare e non si desidera cambiare config/environments/test.rb, è possibile seguire la soluzione da questo post.

Problemi correlati