我有两个规格,一个请求规范和一个控制器规范。我希望客户端从他们的帖子数据中省略根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
答案 0 :(得分:0)
您需要将format: 'json'
添加到控制器规范中的post :create
参数中:
post_data = { format: 'json', param1: 'foo', param2: 'bar' }
post :create, post_data, subdomain: 'api'