RSpecで「should_receive」の回数を増やす方法


112

私はテストでこれを持っています

Project.should_receive(:find).with(@project).and_return(@project)

しかし、オブジェクトがそのメソッド呼び出しを2回受け取ったとき、私はしなければなりません

Project.should_receive(:find).with(@project).and_return(@project)
Project.should_receive(:find).with(@project).and_return(@project)

次のような言い方はありますか

Project.should_receive(:find).with(@project).and_return(@project).times(2)

回答:


214

これは時代遅れです。以下のウリの答えを確認してください

2回:

Project.should_receive(:find).twice.with(@project).and_return(@project)

ちょうどn回:

Project.should_receive(:find).exactly(n).times.with(@project).and_return(@project)

少なくともn回:

Project.should_receive(:msg).at_least(n).times.with(@project).and_return(@project)

詳しくは、https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-countsの「Receive Counts」ご覧ください。

それが役に立てば幸い=)


3
多分これはうまくいかないようany_instanceです?
Jared Beck

@YoLudkeわからない
Jared Beck

2
Uriの回答に記載されている新しい構文を使用する必要があります。
theblang

61

expectrspec の新しい構文は次のようになります。

2回:

expect(Project).to receive(:find).twice.with(@project).and_return(@project)

ちょうどn回:

expect(Project).to receive(:find).exactly(n).times.with(@project).and_return(@project)

少なくともn回:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)

1
have_received構文も動作します。expect(Project).to have_received(:find).exactly(n).times
デビッド・チュート

0

@JaredBeckが指摘しました。解決策は私にany_instance電話で機能しませんでした。

どのインスタンスでも、should_receiveではなくスタブを使用してしまいました。

Project.any_instance.stub(:some_method).and_return("value")

これはどのような場合でも機能します。でも時々。



0

should_receiveは、とは対照的にany_instance、クラスが指定された回数メッセージを受信することを期待しています。

any_instance 一方、メソッドのスタブには一般的に使用されます。

したがって、最初のケースはテストしたい期待ですが、2番目のケースはメソッドを通過して次の行に進むため、先に進むことができます。


1
ドレンミほぼ1年前に追加した投稿にいくつかのカンマを追加するのにかかった時間に感謝します...回答の技術的な側面に変更があったようには見えませんでした...なぜ反対票を投じますか私のために...?
amnsan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.