クラスのインスタンスが特定のメソッドを受け取ることを確認する必要がありますが、多くのインスタンスがそれを受け取るかどうかは気にしません (受け取るはずです)。
私はこのように試しました:
expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once)
しかし、明らかに、単一のインスタンスのみがメソッドを複数回受け取ることができますが、異なるインスタンスは受け取れません。
それを達成する方法はありますか?
クラスのインスタンスが特定のメソッドを受け取ることを確認する必要がありますが、多くのインスタンスがそれを受け取るかどうかは気にしません (受け取るはずです)。
私はこのように試しました:
expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once)
しかし、明らかに、単一のインスタンスのみがメソッドを複数回受け取ることができますが、異なるインスタンスは受け取れません。
それを達成する方法はありますか?
これは rspec-mocks の既知の問題です。のv3.4ドキュメントからAny instance
:
rspec-mocks API は個々のオブジェクト インスタンス用に設計されていますが、この機能はオブジェクトのクラス全体で動作します。その結果、意味的に紛らわしいエッジケースがいくつかあります。たとえば
expect_any_instance_of(Widget).to receive(:name).twice
、特定のインスタンスが名前を 2 回受け取ることが予想されるのか、それとも合計で 2 回受け取ることが予想されるのかは明らかではありません。(前者です。)
さらに
この機能を使用すると、デザインの匂いがすることがよくあります。テストがやりすぎているか、テスト対象のオブジェクトが複雑すぎる可能性があります。
「紛らわしいエッジケース」を回避するために、テストまたはアプリのコードをリファクタリングする方法はありますか? おそらく、テスト ダブルを構築し、それがメッセージを受信することを期待することでしょうか?