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

Rails5+jsonapi(0.9.0)+Rspec-rails请求测试遇400错误

解决RSpec请求测试返回400 Bad Request,但curl/Postman正常的问题

这种情况我之前踩过好几次坑,大概率是RSpec测试里的请求配置和你手动调用时的配置不一致导致的,咱们一步步来排查解决:

1. 先检查请求头是否完全匹配

你用curl的时候明确指定了Content-Type: application/vnd.api+json和Accept: application/vnd.api+json,这两个头对JSON API格式的接口至关重要。很多人在RSpec里会忽略设置这两个头,导致后端无法正确解析请求体。

正确的RSpec请求写法应该是这样的:

post '/api/v1/drivers', 
  params: { 
    data: { 
      type: "drivers", 
      attributes: { 
        firstname: "John", 
        lastname: "Doe", 
        age: "24", 
        status: "pending" 
      } 
    } 
  }, 
  headers: { 
    'Content-Type' => 'application/vnd.api+json', 
    'Accept' => 'application/vnd.api+json' 
  }

如果默认的params传递方式还是有问题,可以直接传递JSON字符串作为请求体,避免Rails自动编码的干扰:

post '/api/v1/drivers', 
  body: { 
    data: { 
      type: "drivers", 
      attributes: { 
        firstname: "John", 
        lastname: "Doe", 
        age: "24", 
        status: "pending" 
      } 
    } 
  }.to_json, 
  headers: { 
    'Content-Type' => 'application/vnd.api+json', 
    'Accept' => 'application/vnd.api+json' 
  }

2. 核对参数格式是否完全一致

仔细对比RSpec里的参数和curl里的参数:

  • 比如age字段,curl里传的是字符串"24",如果RSpec里你传的是整数24,后端的校验规则如果要求字符串类型,就会直接返回400
  • 检查status等枚举字段的大小写、拼写是否完全匹配,比如有没有写成"Pending"而不是"pending"

3. 打印响应体看具体错误信息

400错误一般会返回详细的错误描述,你可以在RSpec测试里加一行代码打印响应内容,精准定位问题:

puts response.body # 或者在测试断言前输出这个内容

常见的错误可能是"param is missing or the value is empty"、某个字段不符合校验规则等,看了具体错误就能快速修复。

4. 排查测试环境的配置差异

虽然概率比较小,但可以确认下RSpec运行的测试环境和本地服务器的环境是否一致:

  • 有没有加载不同的初始化文件?
  • 比如CORS中间件在测试环境里的配置是否允许测试请求?
  • 后端的参数校验规则在测试环境里有没有特殊配置?

按上面的步骤排查下来,基本就能解决RSpec测试返回400的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:20:09