rspecシナリオでKernel.sleepをスタブする方法はありますか?
8 に答える
オブジェクトのコンテキスト内で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
重要なのは、睡眠が呼び出される状況で「自己」が何であれ、睡眠をスタブすることです。
toの呼び出しがsleep
オブジェクト内にない場合(たとえば、rakeタスクのテスト中)、beforeブロックに以下を追加できます(rspec 3構文)。
allow_any_instance_of(Object).to receive(:sleep)
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
ます。これは、複雑なスレッドの問題を突き止めるのに役立ちます。
純粋な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
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
rspecバージョン1では、スタブ構文が変更されました。これは機能します:
allow_any_instance_of(Kernel).to receive(:sleep).and_return("")
使うとき。
私は必要なものをスタブする必要があり、長い間検索した後、私のために働いた唯一の方法はこれであることがわかりました
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
ここで他のソリューションを機能させることができませんでした。新しいバージョンのRubyでのスリープの処理方法、またはその他の方法で何かが変更された可能性があります。
私がやったことは、これがスリープ呼び出しを受信するものであるように見えるので、 Objectクラスにモンキーパッチを適用することでした。だから私は単にこれを追加しました:
class Object
def sleep(*args)
end
end
そのため、sleepメソッドは何かの代わりに何もしません。これをより適切にモックする方法があるかもしれませんが、それをsleep metohd
使用する可能性のあるすべてのオブジェクトをモックすることなく、適切な解決策を見つけることはできませんでした。