当请求规范通过相同的参数时,为什么此控制器规范会报告路由错误?

时间:2014-07-24 18:40:23

标签: ruby-on-rails ruby rspec routes

我有两个规格,一个请求规范和一个控制器规范。我希望客户端从他们的帖子数据中省略根json节点,并且请求规范证明这是有效的。事实上,Rails似乎是在它没有出现时创建这个根节点,这就是下面的控制器实现工作的原因。但是,如果未指定此根节点,则控制器规范将失败。堆栈跟踪指示缺少此节点时的路由错误。我正在寻找一个关于为什么会发生这种情况的解释,以便我可以修复我的控制器规范,或者和平地理解为什么它们必须是不同的。

Rails:3.2.18

Rspec:2.14.7

追踪:

1) Api::V2::ExamplesController has a status of 201
   Failure/Error: post :create, post_data, subdomain: 'api'
   ActionController::RoutingError:
     No route matches {:param1=>"foo", :param2=>"bar", :controller=>"api/v2/exampless", :action=>"create"}
   # ./spec/controllers/api/v2/examples_controller_spec.rb:2:in `block (2 levels) in <top (required)>'

(传递)请求规范:

describe 'Webhook' do
  it 'has a status of 201' do
    host! 'api.example.com'
    post_data = { param1: 'foo', param2: 'bar' }
    post '/v2/examples', post_data, json_request_headers
    expect(response.status).to eq(201)
  end
end

def json_request_headers
  {
    'Accept' => 'application/json',
    'Content-Type' => 'application/json'
  }
end

(失败的)控制器规范:

describe Api::V2::ExamplesController do
  it 'has a status of 201' do
    request.env['HTTP_ACCEPT'] = 'application/json'
    request.env['HTTP_CONTENT_TYPE'] = 'application/json'
    post_data = { param1: 'foo', param2: 'bar' }
    post :create, post_data, subdomain: 'api'
    expect(response.status).to eq(201)
  end
end

当第6行读取post :create, example: post_data, subdomain: 'api'

时,此测试成功

控制器:

module Api::V2
  class ExamplesController
    skip_before_filter :verify_authenticity_token

    def create
      Example.create!(params[:example])
      head :created
    end
  end
end

路线:

namespace :api, defaults: { format: 'json' }, subdomain: 'api', path: '/' do
  namespace :v2 do
    resources :examples, only: :create
  end
end

1 个答案:

答案 0 :(得分:0)

您需要将format: 'json'添加到控制器规范中的post :create参数中:

post_data = { format: 'json', param1: 'foo', param2: 'bar' }
post :create, post_data, subdomain: 'api'