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

如何在RSpec中编写带JSON+PDF上传的POST表单接口测试用例

解决方案

你现有的写法存在两个核心错误导致参数无法被正确解析:

  1. 语法错误:你试图对book对应的JSON字符串直接调用merge方法,Ruby中字符串没有该方法,参数构造逻辑本身就不成立
  2. 缺少multipart声明:RSpec默认不会自动识别带文件的请求为form-data格式,需要显式指定

正确的RSpec用例写法

it 'creates book successfully' do
  # 先构造book字段的JSON字符串,避免手动写转义符出错
  book_json = {
    book: {
      info: {
        reference_id: "43999"
      }
    }
  }.to_json

  # 所有参数统一放在Hash中
  params = {
    book: book_json,
    book_content: fixture_file_upload('spec/fixtures/files/book_content.pdf', 'application/pdf'),
    book_booksummery: fixture_file_upload('spec/fixtures/files/book_booksummery.pdf', 'application/pdf')
  }

  # 发送请求时显式指定format: :multipart,告诉Rails按form-data格式解析
  post '/api/v1/books', params: params, headers: headers_data, format: :multipart

  expect(response).to have_http_status(201)
  expect(json['reference_id']).to eq '43999'
end

额外注意事项

  • 如果你用的是Rails 5及以上版本,需要先在rails_helper.rb中引入文件上传测试工具,否则fixture_file_upload会报错:
    RSpec.configure do |config|
      config.include ActionDispatch::TestProcess::FixtureFile
    end
    
  • 如果还是返回422,可以先在控制器中打印params日志,确认book字段的JSON字符串是否完整、有没有被额外转义,文件参数是否被正确接收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:54:04