2016-02-10 55 views
6

私のクラスのインスタンスが特定のメソッドを受け取るかどうかを確認する必要がありますが、多くのインスタンスがそれを受け取るかどうかは気にしません。Rspec - expect_any_instance_ofと受信カウントを組み合わせる

私はこのように試してみました:

expect_any_instance_of(MyClass).to receive(:my_method).at_least(:once) 

をしかし、どうやら、それだけで別のインスタンスに対してメソッドを複数回受信する単一のインスタンスが可能になりますが、ではありません。

これを達成する方法はありますか?

答えて

4

これはrspec-mocksの既知の問題です。 Any instancev3.4 documentationから:

RSpecの - モックのAPIは、個々のオブジェクトインスタンスのために設計されていますが、この機能は、オブジェクトのクラス全体で動作します。その結果、いくつかの意味的に混乱するエッジケースがあります。たとえば、expect_any_instance_of(Widget).to receive(:name).twiceでは、特定のインスタンスが名前を2回受け取るかどうか、または2つが合計を受け取るかどうかは不明です。 (それはかつてのだ。)この機能を使用する

さらに

は、多くの場合、設計香りです。あなたのテストがあまりにも多くをしようとしているか、あるいはテスト対象のオブジェクトが複雑すぎるかもしれません。

「紛らわしいエッジケース」を避けるためにテストコードやアプリケーションコードをリファクタリングする方法はありますか?おそらく、テストダブルを構築し、メッセージを受け取ることを期待しているでしょうか?

+0

私のクラスに、新しいオブジェクトは私がテストで作成した特定のものでなければならないと教えてください。これは一般的なプラクティスですか? – Mat

+0

それはそう考えられます。私は人気に話すことができませんが、それをショットを与える! – messanjah