12

ユーザーがボタンをクリックすると、データベースに新しいレコードが作成される統合テストを作成しようとしています(CheckPriceモデル)。

nil is not a symbolテストを実行しようとすると、エラーが発生します。

require 'spec_helper'

describe 'CheckPrice', type: :request, js: true  do
  it "should create a new CheckPrice record when user clicks Check Price on topic page" do
    city = create :city
    hotel = create :hotel
    affiliate_link = create :affiliate_link

    visit '/hotel-bilboa-hotel'
    sleep 2
    click_button "Check Prices"
    response.should change(CheckPrice.count).by(1)
  end
end

[価格の確認]をクリックすると、checkprices_controllerに新しいメソッドをトリガーするイベントリスナーがあります。

エラーは最後の行で発生しているようresponse.should change(CheckPrice.count).by(1)です。メソッドがモデルCheckPriceを認識していないようです。CheckPriceテーブルを参照するにはどうすればよいですか?

ありがとう。

4

4 に答える 4

16

change応答オブジェクトでこのようなマッチャーを使用することはできないと思います。これを試して:

expect {
  click_button "Check Prices"
}.to change{ CheckPrice.count }.by(1)

これは、IMOの意味も意味があります。

その他の例については、このチートシートを参照してください。

于 2012-11-05T20:58:34.027 に答える
15

セマンティックはさておき、元の質問に答えて(「nilは記号ではありません」)、私と同じようにここに着陸する可能性のある他の人を助けるために、かっこ()の代わりに中かっこ{}を使用してください。

だから(正しい)

response.should change{CheckPrice.count}.by(1)
response.should change(CheckPrice, :count).by(1)

代わりに(動作しません、上記の2つの組み合わせ)

response.should change(CheckPrice.count).by(1)

編集:

推奨されるexpect構文と同じ答え

だから(正しい)

expect{response}.to change{CheckPrice.count}.by(1)
expect{response}.to change(CheckPrice, :count).by(1)

代わりに(動作しません、上記の2つの組み合わせ)

expect{response}.to change(CheckPrice.count).by(1)
于 2013-07-01T22:22:16.940 に答える
1

これを行う別の方法は次のとおりです。

expect do
    click_button "Check Prices"
end.to change(CheckPrice, :count).by(1)

countこれは、上のメソッドの出力CheckPriceが変更されることになっていることを示しています。2つのパラメータがに渡されるとchange、1つは受信者であり、もう1つは送信するシンボルであると見なされます。

于 2013-03-26T04:18:57.343 に答える
0

私は同じ問題に遭遇しました。他の回答が言うように、メソッドexpectchange、この場合はパラメーターとしてブロックを期待している場合があります。

したがって、Railsでは、{}またはdo end構文のいずれかを使用できます。

于 2014-09-02T20:30:01.513 に答える