为RSpec和Rails-API设置Content-Type标头

Pet*_*own 11 rspec ruby-on-rails ruby-on-rails-3.2 rails-api

我正在使用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
Run Code Online (Sandbox Code Playgroud)

这个hack不再有效(@request是nil),而且我发现的其他Stack Overflow帖子都没有.

如果我在RSpec测试中提出以下请求:

put "/projects/1.json", {name: 'Updated Project 1'}
Run Code Online (Sandbox Code Playgroud)

并在我的控制器中放置一个调试器:

(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"
Run Code Online (Sandbox Code Playgroud)

我希望看到类似于params hash的东西(注意添加项目键):

{ "name"=>"Updated Project 1",
  "action"=>"update",
  "controller"=>"projects",
  "id"=>"5539bbd9-010c-4cfb-88d3-82dadbc99507",
  "format"=>"json",
  "project" => {"name" => "Updated Project 1"}
}
Run Code Online (Sandbox Code Playgroud)

是否可以仅使用RSpec设置内容类型标题?或者我是否必须使用机架/测试来实现此功能?

Vel*_*Les 21

很多挫折和变化,这对我有用. 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"
Run Code Online (Sandbox Code Playgroud)

wrap_parameters似乎是以这种方式声明的

wrap_parameters User, format: :json
Run Code Online (Sandbox Code Playgroud)

用于User模型


kma*_*ana 6

如果有人正在寻找更新的版本,这对我有用Rails 4.0.3Rspec 2.14.1.

put '/projects/1.json', {name: 'Updated Project 1'}, {
  'HTTP_ACCEPT' => 'application/json',
  'CONTENT_TYPE' => 'application/json'
}
Run Code Online (Sandbox Code Playgroud)

wrap_parameters Project, format: :json
Run Code Online (Sandbox Code Playgroud)


小智 5

仅使用新的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
Run Code Online (Sandbox Code Playgroud)

请记住,这将覆盖所有规格,./spec/requests因此如果您需要使用,"application/x-www-form-urlencoded"您也include可以根据需要手动使用此模块Describe 'something' do.