2009-07-22 27 views

答えて

43

呼び出している場合睡眠であることがわかりましたオブジェクトのコンテキストでは、オブジェクトにスタブする必要があります。

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 

キーは、どのような「自己」でも、睡眠が呼び出される状況にある。

+1

私のためにうまくいった、乾杯! – opsb

+0

テスト中のオブジェクトをスタブするのは良い考えではありません。例については、http://robots.thoughtbot.com/don-t-stub-the-system-under-test – georgebrock

+1

@georgebrockを無関係な理由で参照してください。私は[これは](http://stackoverflow.com/a/27749263/52499)が意図を最もよく伝える方法だと信じています。より新しい構文を使用している必要があります。 'allow_any_instance_of(Object).to receive(:sleep)' –

2

あなたが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ので

4

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 
+8

これは私にとってすぐにはうまくいかなかったので、 。それをこのように嘲笑するために。ちょうど睡眠を直接呼び出すと失敗します –

+0

はい、あなたが呼び出すメソッドは、その中に睡眠を持っています。 – nitecoder

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 
0

私はここで他のソリューションを利用することができませんでした。おそらく、Rubyの新しいバージョンなどで睡眠が処理される方法が変わったかもしれません。

私がやったことは、スリープコールを受信すると思われるので、オブジェクトクラスをモンキーパッチすることでした。だから私はこれを単に追加しました:

class Object 
    def sleep(*args) 
    end 
end 

したがって、sleepメソッドは何かの代わりに何もしません。これをもっとうまく模倣する方法があるかもしれませんが、私は、それを使用する可能性のあるすべてのオブジェクトのsleep metohdを嘲笑せずに良い解決策を見つけることができませんでした。

+0

私の解決策をご覧ください。 rspec-mockはここにありますので、あなたはmonkey-patchにする必要はありません – Benj

11

sleepへの呼び出しは、オブジェクト内ではない(例えばrakeタスクをテストしている間)、あなたはブロックの前(RSpecの3構文)に以下を追加することができます

allow_any_instance_of(Object).to receive(:sleep) 
関連する問題