Testing response for named routes in integration tests

In integration tests, you can test the response of the server given a
url_for_options hash, like so:
get(:action, :param1 => “one”, :param2 => “two”, …)
assert_response :success

However, this doesn’t work with a named route.

routes.rb

map.thing_download “things/:id/download” {:controller
=> :things, :action => :download}

things_controller_test.rb:

get(:download, :id => @thing.id) #=> ActionController::RoutingError,
no route matches {:controller => :things, :action => :download, :id =>
12}
get(thing_download_path(@thing)) #=> ActionController::RoutingError,
no route matches {:controller => :things, :action => “/things/12/
download”}

Is there a way to get a response from a named route in functional
tests? For the time being I’ve resorted to misusing integration tests
for this purpose, because inheriting from
ActionController::IntegrationTest gives you a get() function that
takes a string, so I can do
get(thing_download_path(@thing))

Adam S. wrote:

In integration tests, you can test the response of the server given a
url_for_options hash, like so:
get(:action, :param1 => “one”, :param2 => “two”, …)
assert_response :success

However, this doesn’t work with a named route.

routes.rb

map.thing_download “things/:id/download” {:controller
=> :things, :action => :download}

things_controller_test.rb:

get(:download, :id => @thing.id) #=> ActionController::RoutingError,
no route matches {:controller => :things, :action => :download, :id =>
12}
get(thing_download_path(@thing)) #=> ActionController::RoutingError,
no route matches {:controller => :things, :action => “/things/12/
download”}

Is there a way to get a response from a named route in functional
tests?

Are you looking for assert_recognizes ?

More to the point, should you care? Routing is UI-facing stuff, so
(even more than elsewhere) you should be testing behavior, not URL
options.

For the time being I’ve resorted to misusing integration tests
for this purpose, because inheriting from
ActionController::IntegrationTest gives you a get() function that
takes a string, so I can do
get(thing_download_path(@thing))

Don’t bother with integration tests. Use Cucumber.

(Also consider RSpec – it’s a lot nicer than Test::Unit.)

Best,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]

On Feb 4, 9:12 am, Marnen Laibow-Koser [email protected] wrote:

Are you looking for assert_recognizes ?

More to the point, should you care? Routing is UI-facing stuff, so
(even more than elsewhere) you should be testing behavior, not URL
options.
I’m not testing the URL, I’m testing the behavior of the application
when the user hits that URL, under different conditions. Under certain
conditions it should be 403 Forbidden, while under others it’s 200 OK.

Don’t bother with integration tests. Use Cucumber.

(Also consider RSpec – it’s a lot nicer than Test::Unit.)
I’ll look into those, thanks.

Adam S. wrote:

On Feb 4, 9:12�am, Marnen Laibow-Koser [email protected] wrote:

Are you looking for assert_recognizes ?

More to the point, should you care? �Routing is UI-facing stuff, so
(even more than elsewhere) you should be testing behavior, not URL
options.
I’m not testing the URL, I’m testing the behavior of the application
when the user hits that URL, under different conditions. Under certain
conditions it should be 403 Forbidden, while under others it’s 200 OK.

Right – so you don’t need to worry about the actual path or params.
You just need to test the response.

I know how to do that in Cucumber, but that uses Webrat’s visit method.
I’m not sure about integration tests.

Don’t bother with integration tests. �Use Cucumber.

(Also consider RSpec – it’s a lot nicer than Test::Unit.)
I’ll look into those, thanks.

Best,
–Â
Marnen Laibow-Koser
http://www.marnen.org
[email protected]