2009-11-19 5 views
13

Da ich einen benannten Route haben:Wie verwende ich rspec, um benannte Routen zu testen?

map.some_route '/some_routes/:id', :controller => 'some', :action => 'other' 

Wie verwende ich die Routing-Spec-Datei 'spec/Routing/some_routing_spec.rb' für die benannte Route zu testen?

Ich habe schon versucht, diese nach dem Block „SomeRouteController beschreiben“ und es funktioniert nicht, ich ‚nicht definierte Methode‚Helfer‘erhalten:

describe SomeRouteHelper, 'some routes named routes' do 
    it 'should recognize some_route' do 
    helper.some_route_path(23).should == '/some_routes/23' 
    end 
end 

Antwort

13

Wenn dies in einer Controller-Spezifikation ist, können Sie die Routing-Methode direkt aufrufen, ohne dass ein Helfer benötigt wird.

describe SomeController do 
    it 'should recognize ma routes!' do 
    thing_path(23).should == '/things/23' 
    end 
end 
+1

Danke, ich habe das auch versucht, wollte nur jemanden anderen sagen hören, dass ich nicht verrückt bin, hehe ... Stellt sich heraus, dass ich verschachtelte Ressourcen verwendet habe, die das Format parent_child_path (23) im Gegensatz zum child_path (23) benötigen Format. – btelles

+0

Dinge ändern sich schnell in RSpec - dchelimsky schlägt vor, den route_to-Matcher zu verwenden: Der route_to-Matcher gibt an, dass eine Anfrage (Verb + uri) routingfähig ist. Es ist am wertvollsten, wenn Sie andere Routen als standardmäßige RESTful-Routen angeben. https://www.relishapp.com/rspec/rspec-rails/v/2-4/docs/routing-specs/route-to-matcher (siehe auch die Antwort von Scarver auf diese Frage) –

2

Sie können diese Angaben in Ihrem Controller tun mit den assert_routing methode, so:

describe UsersController do 
    it "should recognize a specific users#show route" do 
    assert_routing("https://stackoverflow.com/users/23", {:controller => "users", :action => "show", :id => 23}) 
    end 
end 

Weitere Dokumentation ist here.

+0

Yup, das ist für die regelmäßige route recognition, ich suchte jedoch nach namen route specs. Trotzdem danke! – btelles

12

In RSpec-Rails 2.7+ können Sie ein spec/routing Verzeichnis erstellen und die Routing-Spezifikationen setzen dort. Weitere Informationen finden Sie unter rspec-rails docs.

6

gibt es eine schöne shoulda Matcher für diese zu:

it { should route(:get, "https://stackoverflow.com/users/23").to(:action => "show", :id => 23) 

Weitere Informationen zur Verwendung shoulda Matcher mit rspec:

https://github.com/thoughtbot/shoulda-matchers

1

Dies ist, wie ich die Spezifikationen mit RSpec2, Shoulda schreiben, und Capybara. Sie würden diese Beispieldatei in # speichern {Rails.root} /spec/routing/thingz_routing_spec.rb oder meine Vorliebe # {Rails.root} /spec/routing/thingz_controller_spec.rb

require "spec_helper" 

describe ThingzController do 
    describe "routing" do 
    it "routes to #index" do 
     get("/thingz").should route_to("thingz#index") 
    end 
    end 
end 
+0

Alternative Syntax: 'sollte route (: get, '/ thingz').to(controller:' thingz ', action:' index ') ' – scarver2