Method get of ActionController::TestCase ignores routes.rb?

Hi!

I’m running into issue which seems to indicate that ActionController::TestCase.get() method ignores what I have in routes.rb.
Happens in 3.0.10 and 3.1.0 too.

I have the following RSpec2 test of my XmlRpcController#index action:

it “should get nothing in response to GET request” do
get :index
response.response_code.should == 400 #bad_request
end

And the only line related to this route in routes.rb is:

post ‘rpc’, :to => “xml_rpc#index”

‘rake routes’ also shows only this route defined.

As a result when I run this test that action actually DOES get executed! I judge this by putting a simple puts inside it) and also a log contains:

“Processing by XmlRpcController#index as HTML”

Also if I go to ‘localhost:3000/rpc’ in browser - it says “no route found”: just like it should. But tests have other behavior and this puzzles me…

Can anybody hint my why does this happen? I’m only starting learning about RoR :slight_smile: Earlier it seemed to me that these ‘get/post’ methods of TestCase do respect routes.rb…

Am I missing something obvious? :slight_smile:

Dmitry Suzdalev wrote in post #1020600:

Can anybody hint my why does this happen? I'm only starting learning
about
RoR :slight_smile: Earlier it seemed to me that these 'get/post' methods of TestCase
do
respect routes.rb...

Am I missing something obvious? :slight_smile:

With this controller:

class PagesController < ApplicationController
  def index
  end

  def home
  end

  def contact
  end

end

...and this single route:

T2App::Application.routes.draw do
  root :to => "pages#index"
end

...and these tests:

require 'spec_helper'

describe PagesController do

  describe "POST 'contact'" do
    it "should be successful" do
      post 'contact'
      response.should be_success
    end
  end

  describe "GET 'contact'" do
    it "should be successful" do
      get 'contact'
      response.should be_success
    end
  end

end

I get these results:

$ bundle exec rspec spec/
No DRb server is running. Running in local process instead ...
FF

Failures:

  1) PagesController POST 'contact' should be successful
     Failure/Error: post 'contact'
     ActionController::RoutingError:
       No route matches {:controller=>"pages", :action=>"contact"}
     # ./spec/controllers/pages_controller_spec.rb:6:in `block (3
levels) in <top (required)>'

  2) PagesController GET 'contact' should be successful
     Failure/Error: get 'contact'
     ActionController::RoutingError:
       No route matches {:controller=>"pages", :action=>"contact"}
     # ./spec/controllers/pages_controller_spec.rb:21:in `block (3
levels) in <top (required)>'

Finished in 0.09563 seconds
2 examples, 2 failures

Failed examples:

rspec ./spec/controllers/pages_controller_spec.rb:5 # PagesController
POST 'contact' should be successful
rspec ./spec/controllers/pages_controller_spec.rb:20 # PagesController
GET 'contact' should be successful

If I add a 'post' route to routes.db:

T2App::Application.routes.draw do
  root :to => "pages#index"

  post "pages/contact"

end

I get these results:

$ bundle exec rspec spec/
No DRb server is running. Running in local process instead ...
..

Finished in 0.11245 seconds
2 examples, 0 failures

I I change the 'post' route to a 'get' route:

T2App::Application.routes.draw do
  root :to => "pages#index"

  get "pages/contact"
end

I get these results:

$ bundle exec rspec spec/
No DRb server is running. Running in local process instead ...
..

Finished in 0.11352 seconds
2 examples, 0 failures

So to me it looks like if you define a get route or a post route, then
rspec allows both get and post requests.

The following tests *do* work as expected:

  describe "GET 'contact'" do
    it "should be successful" do
      { :get => 'pages/contact' }.should be_routable
    end
  end

  describe "POST 'contact'" do
    it "should be successful" do
      { :post => 'pages/contact' }.should be_routable
    end
  end

For instance, with this route:

T2App::Application.routes.draw do
  get "pages/contact"
end

I get these results:

$ bundle exec rspec spec/
No DRb server is running. Running in local process instead ...
..F

Failures:

  1) PagesController POST 'contact' should be successful
     Failure/Error: { :post => 'pages/contact' }.should be_routable
       expected {:post=>"pages/contact"} to be routable
     # ./spec/controllers/pages_controller_spec.rb:28:in `block (3
levels) in <top (required)>'

Finished in 0.12608 seconds
3 examples, 1 failure

Failed examples:

rspec ./spec/controllers/pages_controller_spec.rb:27 # PagesController
POST 'contact' should be successful

Wow, that matcher works indeed!

Thank you very much for analysis and for a solution!