RSpec:stubbing Kernel :: sleep?

Rea*_*nly 38 ruby rspec

有没有办法在rspec场景中存根Kernel.sleep?

小智 47

如果您在对象的上下文中调用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
Run Code Online (Sandbox Code Playgroud)

关键是,在调用睡眠的上下文中,对任何"自我"进行存根休眠.

  • @georgebrock因为无关紧要的原因,不是吗?我相信[这个](http://stackoverflow.com/a/27749263/52499)是最能传达意图的方式.并且必须使用更新的语法.`allow_any_instance_of(Object).接收(:sleep)` (2认同)

Ben*_*enj 20

当调用sleep不在对象内时(例如,在测试rake任务时),可以在before块中添加以下内容(rspec 3语法)

allow_any_instance_of(Object).to receive(:sleep)
Run Code Online (Sandbox Code Playgroud)


nit*_*der 5

在纯 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
Run Code Online (Sandbox Code Playgroud)

  • 澄清一下,因为这不能立即对我起作用,所以您必须调用 Kernel.sleep,以便以这种方式模拟它。直接调用sleep失败 (13认同)