2016-02-10 3 views
6

Ich muss überprüfen, dass jede Instanz meiner Klasse eine bestimmte Methode empfängt, aber es ist mir egal, wenn viele Instanzen es erhalten (sie sollen).Rspec - kombinieren expect_any_instance_of und einen Empfang zählt

Ich habe versucht, wie folgt aus:

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

Aber anscheinend, es erlaubt nur für eine einzelne Instanz die Methode mehrfach zu empfangen, aber nicht für andere Instanzen.

Gibt es eine Möglichkeit, das zu erreichen?

Antwort

4

Dies ist ein bekanntes Problem in Rspec-Mocks. Von dem v3.4 documentation auf Any instance:

Der rspec-Mocks API für einzelne Objektinstanzen ausgelegt ist, aber diese Funktion arbeitet auf ganze Klassen von Objekten. Infolgedessen gibt es einige semantisch verwirrende Randfälle. Zum Beispiel ist in expect_any_instance_of(Widget).to receive(:name).twice nicht klar, ob eine bestimmte Instanz erwartet wird, den Namen zweimal zu erhalten, oder wenn zwei empfangen insgesamt erwartet werden. (Es ist die ehemalige.)

Außerdem

Mit dieser Funktion ist oft ein Design Geruch. Es kann sein, dass Ihr Test zu viel versucht oder dass das zu testende Objekt zu komplex ist.

Haben Sie eine Möglichkeit, Ihren Test oder App-Code umzuformulieren, um den "verwirrenden Randfall" zu vermeiden? Vielleicht indem Sie ein Testdoppel konstruieren und erwarten, dass es Nachrichten empfängt?

+0

Vielleicht, indem ich meiner Klasse sage, dass jedes neue Objekt ein bestimmtes sein soll, das ich in meinem Test erstelle? Ist das übliche Praxis? – Mat

+0

Das klingt plausibel. Ich kann nicht mit der Popularität sprechen, aber versuchen Sie es! – messanjah