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

Ruby on Rails中如何在RSpec测试里发送RSwag Schema外的参数?

在RSwag + RSpec中发送未定义的请求参数

我之前也碰到过一模一样的问题——RSwag默认只会用你在Swagger块里显式声明的参数来构造请求,所以你之前试的几种let写法都不会被它识别,自然没法把未定义的sort[direction]带进去,导致测试走了成功逻辑返回200。

给你两个靠谱的解决办法:

方法一:通过query_params合并参数

RSwag处理GET请求时,会读取query_params变量来组装查询参数。你可以在目标context里重写这个变量,把未声明的参数加进去:

context "with unrecognized param" do
  # 用super()保留原有已声明的参数,再合并新参数
  let(:query_params) { super().merge({ "sort[direction]" => "asc" }) }

  run_test! do |response|
    expect(json_response["errors"]).to contain_exactly(
      # 这里放你的错误断言内容
    )
  end
end

如果你的测试不需要保留其他已声明的参数,直接写let(:query_params) { { "sort[direction]" => "asc" } }就行。

方法二:手动发起请求(更直接)

要是上面的方法不生效,你可以直接绕过RSwag的默认请求构造,用RSpec原生的get方法发送请求:

context "with unrecognized param" do
  run_test! do
    # 完全自定义请求参数,不受Swagger定义限制
    get "/resources", params: { sort: { direction: "asc" } }
    expect(response).to have_http_status(:unprocessable_entity)
    expect(json_response["errors"]).to contain_exactly(
      # 这里放你的错误断言内容
    )
  end
end

简单说下为什么之前的写法没用:RSwag的参数绑定逻辑很严格,只有在parameter块里声明过的参数,对应的let变量才会被自动加入请求。你要传的sort[direction]没在Swagger里定义,所以不管怎么写let都不会被RSwag处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:48:15