2017-04-14 14 views
5

私は新しいプロジェクトを開始しています。私はRails 5.1.0で最初のプロジェクトです。私は最初の要求仕様で鉛を持っています。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を取り出して、ハッシュを送信する場合:

ArgumentError: unknown keyword: user 

どれ思考:

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

が、私は別のエラーを得ましたか。

+0

あなたは正しいと思います。私はドキュメントが古くなっていると思います...あなたは答えフィールドにペーストyoureの答えをコピーできますか?私はそれを受け入れることができますか? – Ruff9

答えて

10

最近彼らが構文を変更したと思います。今度は、キーワードargsを使うべきです。したがって、次のようなものがあります。

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

アプリケーションをRails 4.2から5.1にアップグレードしているときに、この問題が発生しました。私はRailsのヘルパーに委任したので、Rspecで変更が書かれていないと思うが、私の質問は:仕様書を新しいフォーマットにアップグレードするための最適な方法があるか、私は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にアップグレードする場合は、lotのテストが必要です。アップグレードを完了するまでは、すべてを変更することに熱心ではありません。古いメソッドの署名私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 

私のテストが戻って作業に行き、私はそれだけだから、それは安全であるべきだと思います現在実行中のテストに適用され、サルパッチなどの宝石のコードを汚染してはいけません。

関連する問題