为RSpec和Rails-API设置Content-Type标头
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为RSpec和Rails-API设置Content-Type标头相关的知识,希望对你有一定的参考价值。
我正在使用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是nil),而且我发现的其他任何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 hash的东西(注意添加项目键):
{ "name"=>"Updated Project 1",
"action"=>"update",
"controller"=>"projects",
"id"=>"5539bbd9-010c-4cfb-88d3-82dadbc99507",
"format"=>"json",
"project" => {"name" => "Updated Project 1"}
}
是否可以仅使用RSpec设置内容类型标题?或者我是否必须使用机架/测试来实现此功能?
很多挫折和变化,这对我有用。 Rails 3.2.12 Rspec 2.10
@request.env["HTTP_ACCEPT"] = "application/json"
@request.env["CONTENT_TYPE"] = "application/json"
put :update, :id => 1, "email" => "bing@test.com"
wrap_parameters似乎是以这种方式声明的
wrap_parameters User, format: :json
被用于User
模型
如果有人正在寻找更新的版本,这对我有用Rails 4.0.3和Rspec 2.14.1。
put '/projects/1.json', {name: 'Updated Project 1'}, {
'HTTP_ACCEPT' => 'application/json',
'CONTENT_TYPE' => 'application/json'
}
和
wrap_parameters Project, format: :json
仅使用新的Rails v5.0.x API设置我发现rails的这个问题将所有内容默认为"application/x-www-form-urlencoded"
仍然存在问题,无法使用RSpec-Rails请求进行测试
以下是我为解决问题所做的工作:
在./spec/support/json_requests.rb
创建支持文件
将其编辑为类似于覆盖所有API仅JSON请求的行为:
module JsonRequests
def get(*args)
super(*json_args(*args))
end
def post(*args)
super(*json_args(*args))
end
def update(*args)
super(*json_args(*args))
end
def patch(*args)
super(*json_args(*args))
end
def put(*args)
super(*json_args(*args))
end
def delete(*args)
super(*json_args(*args))
end
def json_args(path, params = {}, headers = {})
[path, params.to_json, headers.merge('CONTENT_TYPE' => 'application/json')]
end
end
RSpec.configure do |config|
config.include JsonRequests, type: :request
end
请记住,这将覆盖./spec/requests
中的所有规格,因此如果您需要使用"application/x-www-form-urlencoded"
,您还可以根据需要在include
块中手动Describe 'something' do
此模块。
如果您使用Rails 4(和rspec~3.7)并且不想使用内联语法:
request.headers["CONTENT_TYPE"] = "application/json"
Rails 5没有黑客:
put(:update,
params: {project_id: 1},
body: {name: 'Updated Project 1'}.to_json,
as: :json)
这正确地设置了content_type
。在控制器中,params
将保持params和body。
以上是关于为RSpec和Rails-API设置Content-Type标头的主要内容,如果未能解决你的问题,请参考以下文章
Paperclip/Rspec 测试:是不是有更快的方法来测试回形针 validates_attachment_content_type?
如何使用 Rails-Api + Vue.js + Cloudinary + Attachinary 上传图片?
如何响应 rails-api 中的 OPTIONS HTTP 方法?