45

rspecシナリオでKernel.sleepをスタブする方法はありますか?

4

8 に答える 8

52

オブジェクトのコンテキスト内でsleepを呼び出す場合は、次のようにオブジェクトにスタブする必要があります。

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

重要なのは、睡眠が呼び出される状況で「自己」が何であれ、睡眠をスタブすることです。

于 2009-08-20T03:44:20.777 に答える
24

toの呼び出しがsleepオブジェクト内にない場合(たとえば、rakeタスクのテスト中)、beforeブロックに以下を追加できます(rspec 3構文)。

allow_any_instance_of(Object).to receive(:sleep)
于 2015-01-02T22:16:28.727 に答える
4

Mochaを使用している場合は、次のように機能します。

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

または、 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

おそらく、単体テストでより複雑なスレッドの問題をテストするべきではありません。ただし、統合テストでは、実際のを使用しKernel.sleepます。これは、複雑なスレッドの問題を突き止めるのに役立ちます。

于 2009-07-23T12:12:40.110 に答える
4

純粋な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
于 2009-07-30T11:22:16.913 に答える
3

Rspecを。でスタブする新しい方法は次のとおりKernal::Sleepです。

これは基本的に次の回答の更新です:同じ質問に対するTonyPitlugaの回答

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
于 2019-11-30T05:48:55.133 に答える
2

rspecバージョン1では、スタブ構文が変更されました。これは機能します:

allow_any_instance_of(Kernel).to receive(:sleep).and_return("")

使うとき。

于 2020-10-25T11:45:02.440 に答える
0

私は必要なものをスタブする必要があり、長い間検索した後、私のために働いた唯一の方法はこれであることがわかりました

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
于 2009-08-17T01:03:43.350 に答える
0

ここで他のソリューションを機能させることができませんでした。新しいバージョンのRubyでのスリープの処理方法、またはその他の方法で何かが変更された可能性があります。

私がやったことは、これがスリープ呼び出しを受信するものであるように見えるので、 Objectクラスにモンキーパッチを適用することでした。だから私は単にこれを追加しました:

class Object
    def sleep(*args)
    end
end

そのため、sleepメソッドは何かの代わりに何もしません。これをより適切にモックする方法があるかもしれませんが、それをsleep metohd使用する可能性のあるすべてのオブジェクトをモックすることなく、適切な解決策を見つけることはできませんでした。

于 2014-10-22T11:34:08.753 に答える