Helper for testing default routes generated by a resource

Snippet posted to: http://snippets.dzone.com/posts/show/4517

These methods test that the routes for resources defined in routes.rb are working as expected. Call them from your functional (controller) tests.

Add the following 3 methods to test/test_helper.rb:

# Test for routes generated by map.resource (singular). def assert_routing_for_resource(controller, skip=, nesting=)   routes = [     ["new",'/new',{},:get], ["create",'',{},:post],     ["show",'',{},:get], ["edit",';edit',{},:get],     ["update",'',{},:put], ["destroy",'',{},:delete]     ]   check_resource_routing(controller, routes, skip, nesting) end # Test for routes generated by map.resources (plural). def assert_routing_for_resources(controller, skip=, nesting=)   routes = [     ["index",'',{},:get], ["new",'/new',{},:get], ["create",'', {},:post],     ["show",'/1',{:id=>'1'},:get], ["edit",'/1;edit',{:id=>'1'},:get],     ["update",'/1',{:id=>'1'},:put], ["destroy",'/1', {:id=>'1'},:delete]     ]   check_resource_routing(controller, routes, skip, nesting) end

# Check that the expected paths will be generated by a resource, and that # the expected params will be generated by paths defined by a resource. # routes is array of [action, url string after controller, extra params]. def check_resource_routing(controller, routes, skip=, nesting=)   # set a prefix for nested resources   prefix = nesting.join('s/1/')   unless prefix.blank?     prefix += "s/1/"   end   # Add params for nested resources.   # For each 'nest', include a ":nest_id=>'1'" param.   params = {}   nesting.each do |param|     params["#{param}_id".to_sym] = '1'   end   # Test each of the standard resource routes.   routes.each do |pair|     unless skip.include? pair[0]       assert_generates("/#{prefix}#{controller}#{pair[1]}",         {:controller=>controller,         :action=>pair[0]}.merge(pair[2]).merge(params), {}, {},         "Failed generation of resource route for action #{pair[0]} / #{prefix}#{controller}#{pair[1]}")       assert_recognizes(         {:controller=>controller,           :action=>pair[0]}.merge(pair[2]).merge(params),         {:path=>"/ #{prefix}#{controller}#{pair[1]}", :method=>pair[3]},         {}, "Failed to recognize resource route for path #{pair[3]}:confused: #{prefix}#{controller}#{pair[1]}")     end   end end

EXAMPLES

You can specify actions to 'skip' (if you have a special route for that action). If using nested resources, set the nesting array (use singular strings).

So, if you have the following in routes.rb:   map.make_thing '/make', :controller=>'things', :action=>'new'   map.resources :nests do |nest|     nest.resources :things   end   map.resource :foo

then you can use the following in things_controller_test.rb:   def test_resource_routing     assert_routing_for_resources 'things', ['new'], ['nest']     assert_routing_for_resource 'foo'   end