2012-12-21 18 views
22

In Rails 3.2.9 Ich habe Seiten benutzerdefinierte Fehler definiert wie folgt aus:Testing Fehlerseiten in Rails mit Rspec + Capybara

# application.rb 
config.exceptions_app = self.routes 

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

, die wie erwartet funktioniert. Als ich eingestellt config.consider_all_requests_local = false in development.rb erhalte ich die not_found Ansicht, wenn /foo Besuch

Aber wie kann ich testen diese mit Rspec + Capybara?

Ich habe dies versucht:

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

Als ich diese spec ich laufen:

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

Wie kann ich das testen?

Edit:

vergessen zu erwähnen: Ich config.consider_all_requests_local = false in test.rb

Antwort

29

Die problematische Einstellung im Test .rb ist nicht nur die

consider_all_requests_local = false 

aber auch

config.action_dispatch.show_exceptions = true 

Wenn Sie dies einstellen, sollten Sie in der Lage sein, den Fehler zu testen. Ich konnte es nicht in einem Rundfilter verwenden.

Werfen Sie einen Blick für http://agileleague.com/blog/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/

+0

Danke, das war genau das, was mir gefehlt hat. Ich dachte, das Problem liege tiefer, also habe ich angefangen, in Capybara herumzukramen ... –

+0

Wie wäre es mit einer Controller-Spezifikation? Mit diesen Änderungen funktionieren meine Feature-Spezifikationen gut, aber ich bekomme immer noch den fehlgeschlagenen Test (mit einem ActiveRecord :: RecordNotFound-Fehler) in einer Controller-Spezifikation. Gibt es etwas, was ich für diese Dinge anders machen muss? – robertwbradford

+0

Der Link ist kaputt und befindet sich jetzt unter http://agileleague.com/blog/rails-3-2-custom-error-pages-the-exceptions_app-and-testing-with-capybara/ –

0

der config.consider_all_requests_local = false Einstellung in config/environments/test.rb auf die gleiche Art und Weise eingestellt werden müssten festgelegt haben Sie für Ihre Entwicklung ein getan haben.

Wenn Sie dies nicht für alle Tests machen wollen, vielleicht später ein rspec around filter wäre sinnvoll, den Zustand vor dem Test zu setzen und wiederherstellen wie so:

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

Ich habe vergessen zu erwähnen, dass ich bereits versucht habe mit 'consider_all_requests_local = false' in' test.rb' zu setzen. –

+1

Funktioniert bei mir leider nicht –

+2

Auch ich habe ActionController :: RoutingError: – Artur79

1

Wenn Sie es tun wollen und wollen nicht config/environments/test.rb ändern, können Sie die Lösung aus diesem post folgen kann.

Verwandte Themen