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
相关产品推荐
相关产品推荐

