47 Stimmen

RSpec: Stubbing Kernel::sleep?

Gibt es eine Möglichkeit, Kernel.sleep in einem rspec-Szenario zu stubben?

52voto

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.

28voto

Benj Punkte 12793

Wenn der Aufruf von sleep nicht innerhalb eines Objekts ist (z. B. beim Testen einer Rake-Aufgabe), können Sie in einem Before-Block Folgendes hinzufügen (rspec 3-Syntax)

allow_any_instance_of(Object).to receive(:sleep)

5voto

nitecoder Punkte 5446

In reinem 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

4voto

James A. Rosen Punkte 62226

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.

3voto

abhijeetps Punkte 3600

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X