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

