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?

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.


+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! 🙏🏽

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.