I'm using the rails-api gem to build a web service and want to test my API with RSpec. Every request I make, regardless of the HTTP method has the CONTENT_TYPE
header set as "application/x-www-form-urlencoded". This isn't really a problem until I try to use wrap_parameters in my controller and it's not have any affect on the params hash:
class ApplicationController < ActionController::API
include ActionController::ParamsWrapper
end
class ProjectsController < ApplicationController
wrap_parameters :project, include: [:name]
# ...
end
This hack no longer works (@request is nil), and none of the other Stack Overflow posts I found work either.
If I make the following request in my RSpec test:
put "/projects/1.json", {name: 'Updated Project 1'}
and put a debugger in my controller I get:
(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"
I'm expecting to see something like this for the params hash (note the addition of the project key):
{ "name"=>"Updated Project 1",
"action"=>"update",
"controller"=>"projects",
"id"=>"5539bbd9-010c-4cfb-88d3-82dadbc99507",
"format"=>"json",
"project" => {"name" => "Updated Project 1"}
}
Is it possible to set the content type header using just RSpec? Or do I have have to use rack/test for this functionality?
This worked for me Rails 4.0.3 and Rspec 2.14.1 if anyone is looking for more recent versions.
and
Rails 5 no hacks:
This sets the
content_type
correctly. In the controllerparams
will hold both params and body.A lot of frustration and variations and that's what worked for me. Rails 3.2.12 Rspec 2.10
wrap_parameters seems to be working declared this way
being used for
User
modelIf you are using Rails 4 (and rspec ~3.7) and don't want to use the inline syntax:
Using the new Rails v5.0.x API only settings I found that this problem with rails defaulting everything to
"application/x-www-form-urlencoded"
is still in issue for testing with RSpec-Rails RequestsHere is what I did to fix the problem:
Create support file at
./spec/support/json_requests.rb
Edit it to be something like this to override the behavior for all of your API only JSON requests:
Keep in mind that this will override all Specs within
./spec/requests
so if you need to use"application/x-www-form-urlencoded"
you could alsoinclude
this module manually as needed in yourDescribe 'something' do
block.