rspecでsleepをスタブする方法

やけに時間が掛かるテストがあるなと思ったらメソッドにsleepが入ってました。
スタブ化したら早くなるんじゃないかと思って調べてみた。

サンプルコード

class User << ActiveRecord::Base
  def hoge
    sleep 5
    true
  end
end
describe "hoge" do
  it "should be true" do
    user = User.new
    user.hoge.should be_true
  end
end

テスト実行

rspec user_spec.rb
.

Finished in 5.01 seconds
1 exampel, 0 failures

sleepの5秒がちゃんとかかっております。

 

最初に考えたのは、sleepはKernelのメソッドだから

Kernel.stub(:sleep)

でうまくいくんじゃ・・・と思ったら見事反応なし。

 

検索してみても有効な方法がみつからない。
いろんな人に聞いた結果こんな感じでできました。

user.stub(:sleep)

実行結果も短くなった。

Finished in 0.031 seconds
1 exampel, 0 failures

 

ちゃんとsleepしてるかテストするにはモックで

user.should_receive(:sleep).with(5)

 

できた時の周りの反応が薄かった・・・