2017-04-14 50 views
5

我开始一个新项目,我的第一个Rails 5.1.0。我有我的第一个请求规范的pb。Rspec请求规格和Rails 5

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)official documentation不多说。

如果我拿出.to_s,并发送哈希值,像这样:

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

我得到另一个错误:

ArgumentError: unknown keyword: user 

任何想法?

+0

你说得对:)我猜他们的文档已经过时了......你能复制粘贴你答案的答案字段,所以我可以接受它吗? – Ruff9

回答

10

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

post '/api/v1/users', params: params, headers: headers 
+0

我刚从自己的应用程序从Rails 4.2升级到5.1时偶然发现了这个问题。我认为这个改变在Rspec中是没有记录的,因为它只是委托给Rails助手,但我的问题是:是否有一种将规范升级到新格式的最佳方式,或者在没有太多修补的情况下使用旧规格?我有900多个规格,其中150个未能解决这个问题,另外150个是其他原因,我想尽可能少地改变它们,以便首先发现和解决“真​​正”的问题。 – wiz

+0

@wiz:很好的问题。我不知道这种方式。到目前为止,我一直在手动更改每个事件。 –

+0

对于它的价值,我将'post'方法追溯到'ActionDispatch :: Integration :: Session#process',我猜这就是Rails 4和5之间的变化。我不能说我熟悉Rails内部,但也许改变是在那里记录的? – wiz

5

这是Sergio's answer的一个小补遗。如果你正在从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 

我的测试,又回到工作,我认为它应该是安全的,因为它是唯一适用于当前正在运行的测试,不应该污染任何宝石代码,例如猴子补丁。

相关问题