ruby-on-rails - 如何在 rails 3 功能测试中发布 JSON 数据

标签 ruby-on-rails json functional-testing

我计划在我的项目中的请求和响应中都使用 JSON 数据,并且在测试中遇到了一些问题。

搜索了一段时间后,我发现以下代码使用 curl发布 JSON 数据:

curl -H "Content-Type:application/json" -H "Accept:application/json" \
    -d '{ "foo" : "bar" }' localhost:3000/api/new

在 Controller 中,我可以简单地使用 params[:foo] 访问 JSON 数据。这真的很容易。但是对于功能测试,我只找到postxhr ( xml_http_request 的别名)。

如何在rails中编写功能测试以达到与使用curl相同的效果?或者我应该以其他方式进行测试?

这是我尝试过的。我找到了 xhr 的实现在 action_controller/test_case.rb ,并尝试添加 jhr方法只是更改“内容类型”和“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对象并看到 body 是 " " .

我也发现one similar question在 Stack Overflow 上,但它适用于 rails 2,并且发布原始数据的答案在 rails 3 中不起作用。

最佳答案

从 Rails 5 开始,这样做的方法是:

post new_widget_url, as: :json, params: { foo: "bar" }

这也将设置 Content-type header 正确(到 application/json )。

关于ruby-on-rails - 如何在 rails 3 功能测试中发布 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5841093/

相关文章:

ruby-on-rails - Rails 中的自定义字段用作 future 条目的模板

ruby-on-rails - 强制has_many但只有一个当前关联的 “rails way”是什么?

javascript - 如何让实习生运行功能测试

ruby-on-rails - 在 shopee 中编辑电子邮件 View

ruby-on-rails - 在 Ruby 中通过递归嵌套哈希

javascript - 在 POST 上将 javascript 对象读取为 JSON

php - IONIC Accordion 列表 + Angular JS + PHP 表单发布

PHP/MySQL - 使用 json 编码数据而不是数据库中的多列

android - Appium 设置 - 没有 ./reset.sh 文件

javascript - 实习生功能测试 - 按顺序单击一组按钮