title: How should I test routes and controllers with rspec?
body: <p>I have just one spec, located at <code>spec/controllers/statuses_spec.rb</code></p>
  
  <p>Here is its contents:</p>
  
  <pre><code>require 'spec_helper'
  
  describe StatusesController do
      describe "routing" do
  
      it "routes to #index" do
          get("/statuses").should route_to("statuses#index")
      end
  
    end
  end
  </code></pre>
  
  <p>Suffice to say, I have a simple statuses scaffold, and the statuses controller has the standard actions for CRUD, including an index action.</p>
  
  <p>However, I get this failure when running the above test:</p>
  
  <pre><code>15:39:52 - INFO - Running: ./spec/controllers/statuses_spec.rb:6
  Run options: include {:locations=&gt;{"./spec/controllers/statuses_spec.rb"=&gt;[6]}}
  F
  
  Failures:
  
    1) StatusesController routing routes to #index
       Failure/Error: get("/statuses").should route_to("statuses#index")
       ActionController::UrlGenerationError:
         No route matches {:controller=&gt;"statuses", :action=&gt;"/statuses"}
       # ./spec/controllers/statuses_spec.rb:8:in `block (3 levels) in &lt;top (required)&gt;'
  
  Finished in 0.21772 seconds
  1 example, 1 failure
  </code></pre>
  
  <p>Rspec makes the assumption that I'm dealing with the <code>statuses</code> controller, which is sort of intuitive I guess because I referenced it in my spec's describe block, and it thinks the string I've passed into the get method ('/statuses') is the function.</p>
  
  <p>Frankly I don't really like this. I want to be able to test the exact string that is in the URL bar is going to the right controller#action pair. Regardless, I do as rspec says and do this:</p>
  
  <pre><code>require 'spec_helper'
  
  describe StatusesController do
      describe "routing" do
  
      it "routes to #index" do
          get("index").should route_to("statuses#index")
      end
  
    end
  end
  </code></pre>
  
  <p>However, now I get this:</p>
  
  <pre><code>Run options: include {:locations=&gt;{"./spec/controllers/statuses_spec.rb"=&gt;[6]}}
  F
  
  Failures:
  
    1) StatusesController routing routes to #index
       Failure/Error: get("index").should route_to("statuses#index")
       NoMethodError:
         undefined method `values' for #&lt;ActionController::TestResponse:0x00000102bd3208&gt;
       # ./spec/controllers/statuses_spec.rb:8:in `block (3 levels) in &lt;top (required)&gt;'
  
  Finished in 0.31019 seconds
  1 example, 1 failure
  
  Failed examples:
  
  rspec ./spec/controllers/statuses_spec.rb:6 # StatusesController routing routes to #index
  </code></pre>
  
  <p>I'm getting a no method error regarding a <code>values</code> method. Values? Seriously, just what? I have no idea why I'm getting this error. Here's my spec helper:</p>
  
  <pre><code># This file is copied to spec/ when you run 'rails generate rspec:install'
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'rspec/autorun'
  require 'capybara/rspec'
  
  # Requires supporting ruby files with custom matchers and macros, etc,
  # in spec/support/ and its subdirectories.
  Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
  
  # Checks for pending migrations before tests are run.
  # If you are not using ActiveRecord, you can remove this line.
  ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
  
  RSpec.configure do |config|
    # ## Mock Framework
    #
    # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
    #
    # config.mock_with :mocha
    # config.mock_with :flexmock
    # config.mock_with :rr
    config.before(:suite) do
      DatabaseCleaner.strategy = :transaction
      DatabaseCleaner.clean_with(:truncation)
    end
  
    config.before(:each) do
      Capybara.run_server = true
      Capybara.javascript_driver = :webkit
      Capybara.default_selector = :css
      Capybara.server_port = 7171
      DatabaseCleaner.start
    end
  
    config.after(:each) do
      DatabaseCleaner.clean
    end
  
    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
  
    config.include RSpec::Rails::RequestExampleGroup, type: :feature
  
    # If you're not using ActiveRecord, or you'd prefer not to run each of your
    # examples within a transaction, remove the following line or assign false
    # instead of true.
    config.use_transactional_fixtures = true
  
    # If true, the base class of anonymous controllers will be inferred
    # automatically. This will be the default behavior in future versions of
    # rspec-rails.
    config.infer_base_class_for_anonymous_controllers = false
  
    # Run specs in random order to surface order dependencies. If you find an
    # order dependency and want to debug it, you can fix the order by providing
    # the seed, which is printed after each run.
    #     --seed 1234
    config.order = "random"
  end
  </code></pre>