【发布时间】:2011-08-16 00:19:42
【问题描述】:
我计划在我的项目中在请求和响应中都使用 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/test_helpers.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, action, parameters, session, flash).tap do
@request.env.delete 'Content-Type'
@request.env.delete 'HTTP_ACCEPT'
end
end
alias jhr :json_http_request
我用这个方法和xhr一样,但是它不起作用。我检查了@response 对象,发现主体是" "。
我还在 Stack Overflow 上找到 one similar question,但它适用于 rails 2,发布原始数据的答案在 rails 3 中不起作用。
【问题讨论】:
-
像往常一样编写功能测试,只需指定请求格式,如 post :new, :foo => 'bar', :format => 'json'
-
我试过了。但是响应的内容类型是“text/html”,正文是
" "。使用xhr发帖时,响应的content-type为“application/json”,body为JSON数据。
标签: ruby-on-rails json functional-testing