【发布时间】:2012-12-18 20:20:22
【问题描述】:
我正在使用 rails-api gem 构建 Web 服务,并希望使用 RSpec 测试我的 API。无论使用哪种 HTTP 方法,我发出的每个请求都将 CONTENT_TYPE 标头设置为“application/x-www-form-urlencoded”。在我尝试在我的控制器中使用 wrap_parameters 并且它对 params 哈希没有任何影响之前,这并不是一个真正的问题:
class ApplicationController < ActionController::API
include ActionController::ParamsWrapper
end
class ProjectsController < ApplicationController
wrap_parameters :project, include: [:name]
# ...
end
This hack 不再有效(@request 为零),我发现的其他 Stack Overflow 帖子也没有。
如果我在我的 RSpec 测试中提出以下请求:
put "/projects/1.json", {name: 'Updated Project 1'}
并在我的控制器中放置一个调试器:
(rdb:1) p params
{ "name"=>"Updated Project 1",
"action"=>"update",
"controller"=>"projects",
"id"=>"5539bbd9-010c-4cfb-88d3-82dadbc99507",
"format"=>"json"
}
(rdb:1) p request.content_type
"application/x-www-form-urlencoded"
我希望在 params 哈希中看到类似的内容(注意添加了项目密钥):
{ "name"=>"Updated Project 1",
"action"=>"update",
"controller"=>"projects",
"id"=>"5539bbd9-010c-4cfb-88d3-82dadbc99507",
"format"=>"json",
"project" => {"name" => "Updated Project 1"}
}
是否可以仅使用 RSpec 设置内容类型标头?还是我必须使用 rack/test 来实现这个功能?
【问题讨论】:
-
wrap_parameters is still busted 有可能与 rails-api 项目有关,这与设置内容类型无关。
-
通过将 :url_encoded_form 格式添加到方法调用中确认 wrap_parameters 起作用:
wrap_parameters format: [:url_encoded_form, :json] -
您可以使用
request.env['HTTP_CONTENT_TYPE'] = 'application/json'或您需要的任何其他内容在控制器中设置rspec 请求环境的元素。
标签: ruby-on-rails rspec ruby-on-rails-3.2 rails-api