Gibt es eine Möglichkeit, Kernel.sleep in einem rspec-Szenario zu stubben?
Antworten
Zu viele Anzeigen?Wenn Sie sleep im Kontext eines Objekts aufrufen, sollten Sie es auf dem Objekt absetzen, etwa so:
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 liegt darin, sleep auf das "Selbst" zu legen, das in dem Kontext steht, in dem sleep aufgerufen wird.
Wenn Sie Folgendes verwenden Mokka dann wird so etwas wie das hier 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 Folgendes verwenden rr :
def setup
stub(Kernel).sleep
end
def test_my_sleepy_method
my_object.take_cat_nap!
assert_received(Kernel) { |k| k.sleep(1800) }
end
Vous wahrscheinlich sollten komplexere Threading-Probleme nicht mit Unit-Tests getestet werden. Bei Integrationstests sollten Sie jedoch die echte Kernel.sleep
die Ihnen helfen wird, komplexe Threading-Probleme aufzuspüren.
Hier ist der neuere Weg, Rspec zu stubben mit Kernal::Sleep
.
Dies ist im Grunde eine Aktualisierung der folgenden Antwort: Die Antwort von Tony Pitluga auf dieselbe Frage
class Foo
def self.some_method
sleep 5
end
end
it "should call sleep" do
allow_any_instance_of(Foo).to receive(:sleep)
expect(Foo).to receive(:sleep).with(5)
Foo.some_method
end
- See previous answers
- Weitere Antworten anzeigen