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

RSpec Request Spec中get方法参数数量错误问题排查

RSpec Request测试get方法参数报错:wrong number of arguments (given 3, expected 1)

问题重现

测试代码:

it "allows a valid request" do
  user = create :user

  headers = {"Authorization" => "Bearer #{user.api_token}"}
  get "/api/v1/user", nil, headers
  expect(response.status).to eq(200)
end

报错信息:

Failure/Error: get "/api/v1/user", nil, headers
     
     ArgumentError:
       wrong number of arguments (given 3, expected 1)

问题原因

你使用的是Rails 5+ 搭配新版RSpec Rails,这类版本中,ActionDispatch的HTTP请求方法(get/post等)已改用单一哈希参数的语法,不再支持旧版get(path, params, headers)三个参数的写法。旧写法是Rails 4及更早版本的规范,新版本已废弃。

解决方法

方法1:改用新版哈希参数写法(推荐)

按照当前Rails规范,将参数整合到一个哈希中,通过:params、:headers等键传递:

it "allows a valid request" do
  user = create :user

  headers = {"Authorization" => "Bearer #{user.api_token}"}
  # 无参数时只传headers
  get "/api/v1/user", headers: headers
  # 如果需要传递请求参数,写法如下:
  # get "/api/v1/user", params: { foo: "bar" }, headers: headers
  expect(response.status).to eq(200)
end

方法2:强制启用旧版语法(仅兼容旧代码时使用)

如果需要保留旧写法,可在spec/rails_helper.rb的RSpec配置块中启用旧版请求语法:

RSpec.configure do |config|
  # 开启旧版请求语法,支持三个参数的调用方式
  config.use_legacy_request_syntax = true
end

关于“官方示例不符”的说明

你看到的“官方示例”大概率是针对Rails 4及更早版本的旧文档或未更新的第三方教程,新版本Rails已统一了请求方法的参数格式,建议优先使用新版写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:22:16