9

我正在开始一个新项目,我的第一个项目是使用 Rails 5.1.0。我有一个带有我的第一个请求规范的 pb。

describe 'Users', type: :request do
  it 'are created from external data' do
    json_string = File.read('path/to/test_data/user_data.json')
    params = { user: JSON.parse(json_string) }
    headers = { "CONTENT_TYPE" => "application/json" }

    expect do
      post '/api/v1/users', params.to_s, headers
    end.to change {
      User.count
    }.by(1)

    expect(response.status).to eq 200
  end
end

此规范返回错误ArgumentError: wrong number of arguments (given 3, expected 1)官方文档不多说了。

如果我取出 .to_s 并发送哈希,如下所示:

post '/api/v1/users', params, headers

我得到另一个错误:

ArgumentError: unknown keyword: user

任何想法?

4

2 回答 2

18

我认为他们最近改变了语法。现在它应该使用关键字 args。所以,像这样:

post '/api/v1/users', params: params, headers: headers
于 2017-04-14T14:11:45.010 回答
13

这是塞尔吉奥的答案的一个小附录。如果你从 Rails 4 升级到 Rails 5,有很多测试,并且不太热衷于改变它们——至少在你完成升级之前不会——我已经找到了一种让它们与旧版本一起工作的方法方法签名。

在我的spec_helper我添加

module FixLegacyTestRequests
  def get(path, par = {}, hdr = {})
    process(:get, path, params: par, headers: hdr)
  end
  def post(path, par = {}, hdr = {})
    process(:post, path, params: par, headers: hdr)
  end
  def put(path, par = {}, hdr = {})
    process(:put, path, params: par, headers: hdr)
  end
  def delete(path, par = {}, hdr = {})
    process(:delete, path, params: par, headers: hdr)
  end
end

然后我为每个测试添加了这个配置:

RSpec.configure do |config|
  config.before :each do |example|
    extend(FixLegacyTestRequests) # to be removed at some point!
  end
end

我的测试重新开始工作,我认为它应该是安全的,因为它只应用于当前正在运行的测试,并且不应该污染任何 gem 的代码,例如猴子补丁。

于 2017-05-04T16:10:42.273 回答