Ruby on Rails中用Swagger测试PDF返回接口遇ActionController::UnknownFormat错误
解决
ActionController::UnknownFormat错误及PDF接口测试正确方式 错误原因
ActionController::UnknownFormat 本质是控制器的respond_to块找不到请求匹配的格式。你的控制器只处理format.pdf,但测试请求没有正确传递Accept: application/pdf头,导致Rails无法识别要返回的格式。
修复步骤
1. 给测试请求手动添加Accept头
修改你的rswag测试代码,在before块中明确设置请求头:
before do |example| sign_in @some_user request.headers['Accept'] = 'application/pdf' # 关键:指定接受PDF格式 submit_request(example.metadata) end
虽然你在测试里写了produces 'application/pdf',但rswag的submit_request可能没有自动将其注入请求头,手动添加可以确保请求格式被正确识别。
2. 确认PDF格式的MIME类型注册
检查config/initializers/mime_types.rb文件,确保已经注册PDF的MIME类型(Rails 7通常默认包含,但如果是自定义配置可能缺失):
Mime::Type.register "application/pdf", :pdf
注册后Rails才能正确将application/pdf映射到:pdf格式,让respond_to能匹配到。
3. 完善测试断言(验证PDF响应细节)
除了状态码,还应该验证响应的内容类型和文件属性,确保返回的是正确的PDF附件:
it 'returns a valid PDF attachment' do |example| submit_request(example.metadata) assert_response :ok # 验证内容类型 assert_equal 'application/pdf', response.content_type # 验证文件名和处置方式 assert_match /attachment; filename="something.pdf"/, response.headers['Content-Disposition'] end
额外注意事项
- 确保你使用的PDF生成gem(比如wicked_pdf)已经正确配置,
ApplicationController.render pdf: ...能正常生成PDF二进制内容。 - 如果测试时还是有问题,可以直接打印
request.headers确认Accept头是否被正确设置,排查请求格式是否传递到控制器。
内容的提问来源于stack exchange,提问作者Hessah
相关产品推荐
相关产品推荐

