13
votes

Given I have a named route:

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

How do I use the routing spec file 'spec/routing/some_routing_spec.rb' to test for that named route?

I've tried this after the "describe SomeRouteController" block and it doesn't work, I get 'undefined method "helper":

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

5 Answers

13
votes

If this is in a controller spec, you can call the routing method directly, no helper needed.

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

In RSpec-Rails 2.7+ you can create a spec/routing directory and put your routing specs in there. See the rspec-rails docs for more info.

6
votes

there's a nice shoulda matcher for this too:

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

more information on using shoulda matchers with rspec:

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

2
votes

You can do this in your controller specs with the assert_routing method, like so:

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

More documentation is here.

1
votes

This is how I write the specs using RSpec2, Shoulda, and Capybara. You would save this example file in #{Rails.root}/spec/routing/thingz_routing_spec.rb or my preference #{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