Object.any_instance sollte empfangen und erwarten, dass () empfangen wird

75

Der folgende Code funktioniert wie erwartet:

Object.any_instance.should_receive(:subscribe)

Bei Verwendung der neuen rspec-Erwartung funktioniert dies jedoch nicht:

expect(Object.any_instance).to receive(:subscribe)

Der Fehler ist:

expected: 1 time with any arguments
received: 0 times with any arguments

Wie kann ich dafür sorgen, dass diese Funktion mit "require ()" empfangen wird?

Calin
quelle

Antworten:

154

Es gibt jetzt eine nicht sehr gut dokumentierte Methode expect_any_instance_of, die den any_instanceSonderfall behandelt. Du solltest benutzen:

expect_any_instance_of(Object).to receive(:subscribe)

Google expect_any_instance_offür weitere Informationen.

Peter Alfvin
quelle
+1 für "nicht sehr gut dokumentiert". Immer noch der Fall. rubydoc.info/gems/rspec-mocks/RSpec/Mocks/…
Johngraham
Ich habe benutzt allow_any_instance_of. Ist es ein Alias ​​dieser Methode?
Rubyprince
1
@rubyprince Sie unterscheiden sich, da die Methoden allow das Verhalten stubben und Methoden erwarten, die auf Verhalten testen. Beispiel: allow(my_obj).to receive(:method_name).and_return(true)Stubs: my_obj.method_name()Wenn es im Test aufgerufen wird, wird es einfach zurückgegeben true. expect(my_obj).to receive(:method_name).and_return(true)ändert kein Verhalten, richtet jedoch eine Testerwartung ein, die fehlschlägt, wenn my_obj.method_name()sie später im Test nicht aufgerufen wird oder nicht true zurückgibt.
Saigo
Danke @Saigo. Macht jetzt Sinn.
Rubyprince
2
Diese Syntax ist veraltet. Gibt es in der heutigen Syntax Hinweise dazu?
iGbanam
1

Nur ein Heads-up, expect_any_instance_ofwird laut Jon Rowe (Key Rspec Contributor) nun als veraltetes Verhalten angesehen . Die vorgeschlagene Alternative besteht darin, die instance_doubleMethode zu verwenden, um eine Scheininstanz Ihrer Klasse zu erstellen und Aufrufe dieser Instanz doppelt zu erwarten, wie in diesem Link beschrieben.

Jons Methode wird bevorzugt (da sie als verallgemeinerte Testhilfemethode verwendet werden kann). Wenn Sie dies jedoch verwirrend finden, kann diese Implementierung für Ihren Beispielfall hoffentlich dazu beitragen, die beabsichtigte Methode zu verstehen:

mock_object = instance_double(Object) # create mock instance
allow(MyModule::MyClass).to receive(:new).and_return(mock_object) # always return this mock instance when constructor is invoked

expect(mock_object).to receive(:subscribe)

Viel Glück! 🙏🏽

Arreth
quelle