You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails+RSpec如何发送原始JSON参数进行POST请求测试?

解决Rails测试中发送原始JSON参数的问题

嘿,我之前在Rails 5.x版本里也折腾过类似的问题,给你几个实用的方案,看哪个适合你的场景:

方案1:直接发送原始JSON请求体(推荐)

如果你的测试不需要模拟formData上传文件,只是想传递原始JSON,那直接设置请求的Content-Type为application/json,然后把原始JSON字符串作为请求体发送就行。Rails不会自动解析这个字符串,你可以在控制器里直接读取原始内容。

在books_spec.rb里这么写:

describe "POST /books" do
  it "receives raw JSON payload" do
    # 定义你的原始JSON字符串
    raw_book_json = '{ "title": "Ruby in Action", "author": "Sam Ruby" }'

    # 发送POST请求,指定Content-Type并传递原始JSON作为body
    post "/books", 
         body: raw_book_json,
         headers: { "Content-Type" => "application/json" }

    # 控制器里可以这样获取原始JSON:
    # raw_json = request.body.read
    # 之后你可以自行解析成Hash或者做其他处理
  end
end

这个方法最直接,完全符合你“发送原始JSON参数”的需求,测试逻辑也清晰。

方案2:模拟formData传递原始JSON字段

如果客户端确实是用formData把原始JSON作为一个字段传递(比如同时要上传文件+JSON),那你可以在测试里把原始JSON作为formData的一个键值对发送,然后在控制器里提取这个字段的原始值。

测试代码示例:

describe "POST /books" do
  it "accepts raw JSON via formData" do
    raw_book_json = '{ "title": "Effective Rails", "author": "Steve Klabnik" }'
    # 构造formData参数,把原始JSON放在book_json字段里
    form_params = { book_json: raw_book_json, cover_image: fixture_file_upload("book_cover.jpg") }

    post "/books", 
         params: form_params,
         headers: { "Content-Type" => "multipart/form-data" }

    # 控制器里提取原始JSON:
    # raw_json = params[:book_json]
    # book_attributes = JSON.parse(raw_json)
  end
end

这种方式完美模拟了客户端的formData提交逻辑,Rails会解析formData成Hash,但book_json字段的值就是你要的原始JSON字符串。

方案3:全局/控制器级修改参数解析行为(不推荐)

如果上面的方案都不满足,你可以在控制器里跳过Rails默认的参数解析,手动读取请求体。但这个方法会影响整个控制器的参数处理,除非必要不建议用:

在books_controller.rb里添加:

before_action :read_raw_json, only: [:create]

private

def read_raw_json
  # 重置请求体指针,确保能读到完整内容
  request.body.rewind
  # 读取原始JSON字符串
  @raw_request_json = request.body.read
  # 如果需要,也可以自己解析成Hash并合并到params里
  # parsed_params = JSON.parse(@raw_request_json)
  # params.merge!(parsed_params)
end

然后测试里还是用方案1的方式发送原始JSON即可。


内容的提问来源于stack exchange,提问作者adavia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:37:45