我计划在我的项目中的请求和响应中使用JSON数据,并在测试中出现问题.
搜索一段时间后,我发现使用curl发送JSON数据的以下代码:
curl -H "Content-Type:application/json" -H "Accept:application/json" \ -d '{ "foo" : "bar" }' localhost:3000/api/new
在控制器中,我可以使用params [:foo]来访问JSON数据,这很简单.但是对于功能测试,我只找到post和xhr(xml_http_request的别名).
如何在rails中编写功能测试来实现与使用curl相同的效果?还是应该用其他方式进行测试?
这是我试过的我在action_controller / test_case.rb中找到xhr的实现,并尝试添加jhr方法,只需更改“Conetent-Type”和“HTTP_ACCEPT”. (在test / helper.rb中添加)
def json_http_request(request_method,action,parameters = nil,session = nil,flash = nil) @request.env['Content-Type'] = 'Application/json' @request.env['HTTP_ACCEPT'] ||= [Mime::JSON,Mime::JS,Mime::HTML,Mime::XML,'text/xml',Mime::ALL].join(',') __send__(request_method,parameters,session,flash).tap do @request.env.delete 'Content-Type' @request.env.delete 'HTTP_ACCEPT' end end alias jhr :json_http_request
我使用的方式与xhr相同,但它不起作用.我检查了@response对象,并看到身体是“”.
我也在堆栈溢出找到one similar question,但它是rails 2,并且发送原始数据的答案在rails 3中不起作用.
解决方法
我发现这正是我想要的 – 将JSON发布到控制器的动作.
post :create,{:format => 'json',:user => { :email => "test@test.com",:password => "foobar"}}