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]}:/
#{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
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---