一尘不染

如何在Rails功能测试中发送原始发布数据?

json

我希望将原始的发布数据(例如,未参数化的JSON)发送到我的一个控制器进行测试:

class LegacyOrderUpdateControllerTest < ActionController::TestCase
  test "sending json" do
    post :index, '{"foo":"bar", "bool":true}'
  end
end

但这给我一个NoMethodError: undefined methodsymbolize_keys’ for

`错误。

用什么发送原始帖子数据的正确方法是什么ActionController::TestCase

这是一些控制器代码:

def index
  post_data = request.body.read
  req = JSON.parse(post_data)
end

阅读 194

收藏
2020-07-27

共1个答案

一尘不染

我今天遇到了同一问题,找到了解决方案。

在您test_helper.rb的内部定义以下方法ActiveSupport::TestCase

def raw_post(action, params, body)
  @request.env['RAW_POST_DATA'] = body
  response = post(action, params)
  @request.env.delete('RAW_POST_DATA')
  response
end

在功能测试中,与post方法一样使用它,但将原始文章正文作为第三个参数传递。

class LegacyOrderUpdateControllerTest < ActionController::TestCase
  test "sending json" do
    raw_post :index, {}, {:foo => "bar", :bool => true}.to_json
  end
end

我在Rails 2.3.4上使用读取原始文章正文时对此进行了测试

request.raw_post

代替

request.body.read

如果您查看源代码,您会发现它raw_post只是在env哈希中加上了对它request.body.read的检查。RAW_POST_DATA``request

2020-07-27