[ACCEPTED]-Where to test routes in ruby on rails-routing
Routes should be done as part of integration 19 tests. Integration tests are where you test 18 the important work flows of your application 17 - more specifically whether a URL is defined 16 or not seems to be an important workflow.
Your 15 integration test would look like any normal integration test:
# /tests/integration/routes_test.rb
require 'test_helper'
class RoutesTest < ActionController::IntegrationTest
test "route test" do
assert_generates "/photos/1", { :controller => "photos", :action => "show", :id => "1" }
assert_generates "/about", :controller => "pages", :action => "about"
end
end
As 14 to @jemminger's response of not testing routes - While 13 it is Rail's tests that verify that routes.rb 12 works, it's not Rail's responsibility to 11 test whether http://yoursite.com/users
is defined in your routes. The 10 caveat is that most route testing could 9 be done in existing integration tests, so 8 specific tests for routes could be redundant.
The 7 specific use case I can think of are all 6 the people that have already, or are going 5 to upgrade from Rails 2 to Rails 3. The 4 code to define routes has changed significantly, and 3 it's better to find out from tests that 2 the routes were upgraded correctly, than 1 from users when they report 404 errors.
Why do you feel the need to test the routes? Purely 9 to make sure that the routes defined in 8 your routes.rb actually work? If so, then 7 don't. That's not the job of your application's 6 tests to make sure that the framework's 5 internals operate properly - that's the 4 job of the Rails framework's own tests.
If 3 perhaps you have some sort of dynamic/user 2 definable route that you want to test, I'd 1 probably go with integration.
I suggest you create a test file for the 18 routes in your test/controllers folder.
class HomeRoutesTest < ActionController::TestCase
test "must route to home index" do
assert_routing '/', controller: "home", action: "index"
end
end
It was mentioned 17 that they belong to integration test. I 16 disagree. You merely test routes, that's 15 it. So it would rather fall into functional 14 or even unit testing instead of integration 13 testing.
You can find a reference in the 12 Rails RailsGuide Testing, section 9. Testing Routes
Integration tests are for the flow, where 11 you test the interaction of different controller 10 action, e.g. executing a business process 9 like user logs in, browses the site and 8 puts an item into the basket. That said 7 your integration tests won't work if your 6 routes don't work. Thus many say that integration 5 tests is the place where you test routes. However, considering 4 the development cycle, you would create 3 unit tests, controller tests, route tests, etc. first 2 before doing the integration tests.
And on 1 another note: assert_routing
does both tests: assert_generates
and assert_recognizes
.
According to a comment in this rails bug, the proper place 10 is in a functional test. If you try to test 9 them in an integration test, the routes 8 you established in routes.rb
will not be available.
require 'test_helper'
class FooControllerTest < ActionController::TestCase
test "foo routes" do
assert_recognizes({:controller => 'foo_controller', :action => 'list'}, '/foos'
end
end
Route 7 tests are good places to list links that 6 exist in the wild, and avoid inadvertently 5 breaking them with a code change. It's a 4 little strange that the tests are scoped 3 to a controller, since it's the route set 2 as a whole you're actually testing, but 1 I haven't heard of a 'route set test'.
If you are using rspec, then the most natural 3 place for routing tests is in the directory 2 spec/routing
. From The Rspec documentation:
Routing specs are marked by
:type => :routing
or 1 if you have setconfig.infer_spec_type_from_file_location!
by placing them in spec/routing.
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.