views:

459

answers:

3

I'm trying to test the routes on my rails 2.3.4 application. There are several sites that explain how to test routes, including the rails docs, but I'm getting errors following the instructions.

First, I'm assuming that these tests can be done in related unit test files. There seems to be no more obvious place, and none of the docs specify.

That said, this is a condensed version of test/unit/TitlesTest.rb

require File.dirname(__FILE__) + '/../test_helper'

class TitleTest < Test::Unit::TestCase
  # include ActionController::Assertions::RoutingAssertions

  def test_routes
    assert_routing "games", { :controller => "titles", :section => "games", :action => "index", :id => nil }
  end
end

rake test:units fails with the error:

NoMethodError: undefined method `assert_routing' for #<TitleTest:0x7f387232ec98>
    /test/unit/title_test.rb:7:in `test_routes'

I saw in the Rails API that assert_routing is defined in ActionController::Assertions::RoutingAssertions, so I attempted to include that module, only to have it fail elsewhere.

Note the commented include line in the code example above.

NoMethodError: undefined method `clean_backtrace' for #<TitleTest:0x7fd895fadf00>
    /test/unit/title_test.rb:7:in `test_routes'

clean_backtrace is another testing method defined in ActionController::TestCase::Assertions.

I'm not getting any google search results for these errors - no one else seems to be having this problem. The problem also occurs if I recreate the scenario in a freshly generated rails app. I don't think I should be having to include these modules in my test cases. What might be wrong here?

A: 

Your routing unit test file has to include the ActionController::Assertions::RoutingAssertions module since Rails 2.3.2.

John Topley
+2  A: 

Routing tests should be done as part of integration tests.

These can be generated using script/generate script/generate integration_test routes

An example:

class RoutesTest < ActionController::IntegrationTest
  fixtures :all

  def test_resources_route
    assert_routing "titles/15", { :controller => "titles", :action => "show", :id => "15" }
  end
end
nilbus
+2  A: 

Hi,

There's a list of upgrading Rails gotchas on Giant Robots. Apparently your routing test should use class ActionController::TestCase, not ActiveSupport::TestCase.

Peter