web-dev-qa-db-ja.com

RSpecで「should_receive」を複数回言う方法

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

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)
104
Jakub Arnold

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

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 under受信カウント

それが役立つことを願っています=)

214
Staelen

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

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)
48
Uri Agassi

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

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

したがって、最初のケースはテストしたいという期待であり、2番目のケースはメソッドを通過して次の行に進んでいるので、先に進みます。

0
amnsan

@JaredBeckは指摘しました。 any_instance呼び出しで解決策が機能しませんでした。

どのインスタンスでも、should_receiveの代わりにスタブを使用することになりました。

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

これはすべての場合に機能します。時の。

0
prasann