2009-11-19 22 views
13

Dato che ho un percorso di nome:Come utilizzare rspec per testare percorsi denominati?

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

Come si usa l'instradamento specifica file 'spec/routing/some_routing_spec.rb' per verificare che percorso di nome?

Ho provato questo dopo il blocco di "descrivere SomeRouteController" e non funziona, ottengo 'metodo non definito 'aiuto':

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

risposta

13

Se si tratta di una specifica del controller, è possibile chiamare direttamente il metodo di instradamento, senza bisogno di supporto.

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

Grazie, ho provato anche quello, volevo solo sentire qualcun altro dire che non ero pazzo, hehe ... Risulta che ho usato risorse nidificate, che richiede il formato parent_child_path (23) rispetto a child_path (23) formato. – btelles

+0

Le cose cambiano velocemente in RSpec - dchelimsky suggerisce di usare route_to matcher: route_to matcher specifica che una richiesta (verbo + uri) è instradabile. È molto utile quando si specificano rotte diverse dalle rotte RESTful standard. https://www.relishapp.com/rspec/rspec-rails/v/2-4/docs/routing-specs/route-to-matcher (vedi anche la risposta di Scarver a questa domanda) –

2

È possibile farlo in vostre specifiche del controller con il assert_routing metodo, in questo modo:

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 

Altra documentazione è here.

+0

Yup, questo è per il riconoscimento di percorsi regolari, ma stavo cercando le specifiche di route con nome. Grazie comunque! – btelles

12

In RSpec-Rails 2.7+ è possibile creare una directory spec/routing e mettere le specifiche di routing in là. Vedi lo rspec-rails docs per maggiori informazioni.

6

c'è una bella matcher shoulda anche per questo:

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

ulteriori informazioni sull'uso shoulda matchers con RSpec:

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

1

Questo è come io scrivo le specifiche che utilizzano RSpec2, Shoulda, e Capibara. Si potrebbe salvare questo file di esempio in # {} Rails.root /spec/routing/thingz_routing_spec.rb o la mia preferenza # {} 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

Sintassi alternativa: 'dovrebbe route (: get, '/thingz').to(controller:' thingz ', action:' index ') ' – scarver2

Problemi correlati