如何在RSpec中编写带JSON+PDF上传的POST表单接口测试用例
解决方案
你现有的写法存在两个核心错误导致参数无法被正确解析:
- 语法错误:你试图对
book对应的JSON字符串直接调用merge方法,Ruby中字符串没有该方法,参数构造逻辑本身就不成立 - 缺少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
相关产品推荐
相关产品推荐

