Gibt es eine Möglichkeit, Kernel.sleep in einem RSPEC-Szenario zu stopfen?RSpec: Stubbing Kernel :: Schlaf?
Antwort
Wenn Sie anrufen Schlaf innerhalb der Kontext eines Objekts, sollten Sie es auf das Objekt, wie so Stummel:
class Foo
def self.some_method
sleep 5
end
end
it "should call sleep" do
Foo.stub!(:sleep)
Foo.should_receive(:sleep).with(5)
Foo.some_method
end
der Schlüssel ist, schlafen auf Stub was auch immer "Selbst" ist in dem Kontext, in dem der Schlaf genannt wird.
Arbeitete gut für mich, Prost! – opsb
Das Prüfobjekt zu stubben ist keine gute Idee. Beispiele: http://robots.thoughtbot.com/don-t-stub-the-system-under-test – georgebrock
@georgebrock aus nicht relevanten Gründen, nicht wahr? Ich glaube [dies] (http://stackoverflow.com/a/27749263/52499) ist der Weg, der die Absicht am besten vermittelt. Und muss eine neuere Syntax verwenden. 'allow_any_instance_of (Object) .to receive (: sleep)' –
Wenn Sie Mocha verwenden, dann wird so etwas wie dies funktionieren:
def setup
Kernel.stubs(:sleep)
end
def test_my_sleepy_method
my_object.take_cat_nap!
Kernel.assert_received(:sleep).with(1800) #should take a half-hour paower-nap
end
Oder wenn Sie rr verwenden:
def setup
stub(Kernel).sleep
end
def test_my_sleepy_method
my_object.take_cat_nap!
assert_received(Kernel) { |k| k.sleep(1800) }
end
Sie wahrscheinlich sollte nicht mehr testen komplexe Threading-Probleme mit Komponententests. Verwenden Sie bei Integrationstests jedoch das echte Kernel.sleep
, mit dem Sie komplexe Threading-Probleme ausfindig machen können.
In reiner rspec:
before do
Kernel.stub!(:sleep)
end
it "should sleep" do
Kernel.should_receive(:sleep).with(100)
Object.method_to_test #We need to call our method to see that it is called
end
Um zu klären, weil dies nicht sofort für mich funktioniert, müssen Sie Kernel aufrufen .schlaf, um es auf diese Weise zu verspotten. Nur sofortiges Aufrufen des Schlafs schlägt fehl –
Ja, die Methode, die Sie anrufen, wird den Schlaf darin haben. – nitecoder
Ich musste Stummel erfordern und nach langer Suche fand ich, dass der einzige Weg, die für mich gearbeitet ist dies
def method_using_sleep
sleep
sleep 0.01
end
it "should use sleep" do
@expectations = mock('expectations')
@expectations.should_receive(:sleep).ordered.with()
@expectations.should_receive(:sleep).ordered.with(0.01)
def sleep(*args)
@expectations.sleep(*args)
end
method_using_sleep
end
Ich konnte die anderen Lösungen hier nicht zum Funktionieren bringen. Vielleicht hat sich etwas in der Art und Weise geändert, wie der Schlaf in neueren Versionen von Ruby oder etwas anderem gehandhabt wird.
Was ich getan habe, war Affe-Patch Objekt Klasse, wie es scheint, dass dies ist, was die Schlafanrufe empfängt. Also fügte ich einfach folgendes hinzu:
class Object
def sleep(*args)
end
end
Also macht die Schlafmethode jetzt nichts statt etwas. Es könnte eine Möglichkeit geben, das besser zu verspotten, aber ich war nicht in der Lage, eine gute Lösung zu finden, ohne die sleep metohd
jedes einzelnen Objekts zu verspotten, das sie möglicherweise benutzt hat.
Siehe meine Lösung unten. Rspec-Mock ist hier, also müssen Sie nicht affektieren – Benj
Wenn der Anruf zu sleep
nicht innerhalb eines Objekts ist (während eine Harke Aufgabe zum Beispiel Testen), können Sie die folgenden in einem vor-Block (rspec 3 Syntax) in
allow_any_instance_of(Object).to receive(:sleep)
- 1. RSpec: Stubbing SFTP
- 2. Rspec 3 Stubbing Benutzereingabe
- 3. Stubbing ActionMailer in Rspec
- 4. Stubbing Time.now mit RSpec
- 5. Stubbing ein Before_filter mit RSpec
- 6. Stubbing RestClient Antwort in RSpec
- 7. Stubbing Chained Methoden mit Rspec
- 8. RSpec, verschachtelte Ressource Methoden stubbing
- 9. Stubbing Devise in rSpec und Rails3
- 10. Rspec Test benötigt Schlaf zu arbeiten
- 11. Stubbing einer Controller-Methode mit Sinatra und rspec
- 12. Stubbing defaults in Mockito
- 13. Stubbing Date.now() und Math.random()
- 14. Komponententests - Stubbing eines SqlDataReader
- 15. RSpec: Stubbing Rails.application.config Wert funktioniert nicht beim erneuten Öffnen von Klassen?
- 16. RSpec Stubbing und Überprüfung von Argumenten, wenn ein Konstruktor eines Objekts instanziiert eine andere
- 17. Stubbing-Methode in ActionDispatch :: IntegrationTest
- 18. Stubbing Push-Benachrichtigungen mit Sinon
- 19. Stubbing verschachtelte Funktionsaufrufe in Sinon
- 20. Mocking/Stubbing Globals in sails.js
- 21. Mockito - NullpointerException wenn stubbing Methode
- 22. Stubbing eine Klassenmethode mit Sinon.js
- 23. Stubbing Variablen in einem Konstruktor?
- 24. Bash Schlaf in Millisekunden
- 25. Schlaf in JQuery?
- 26. Qthread - Schlaf bis Ereignis
- 27. Unterbrechbarer Schlaf in Qt?
- 28. Schlaf-bis in C#
- 29. Unterbrechung von QThread Schlaf
- 30. Schlaf in Smalltalk Squeak
Suchen Sie etwas über Kernel :: stubs (: schlafen) –
Ich könnte mir vorstellen, er würde wollen, dass es funktioniert und nicht schlafen, vielleicht verlangsamt seinen Test ... – Rich