RSpec:stubbing Kernel :: sleep?

时间:2009-07-22 23:40:12

标签: ruby rspec

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

8 个答案:

答案 0 :(得分:46)

如果你在一个对象的上下文中调用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

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

答案 1 :(得分:17)

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

allow_any_instance_of(Object).to receive(:sleep)

答案 2 :(得分: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

答案 3 :(得分:3)

如果你使用的是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,这将帮助您找出复杂的线程问题。

答案 4 :(得分: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

答案 5 :(得分:0)

我无法让其他解决方案在这里工作。也许在较新版本的Ruby中处理睡眠的方式发生了一些变化,或其他方面。

我最终做的是对 Object 类进行修补,因为看起来这是接收睡眠调用的内容。所以我只是添加了这个:

class Object
    def sleep(*args)
    end
end

所以睡眠方法现在什么都没做,而不是做什么。可能有一些方法可以更好地模拟这个,但是如果没有模仿可能使用它的每个单个对象的sleep metohd,我就无法找到一个好的解决方案。

答案 6 :(得分:0)

这是使用Kernal::Sleep对Rspec进行存根的新方法。

这基本上是对以下答案的更新:Tony Pitluga's answer to the same question

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

答案 7 :(得分:0)

对于rspec版本1,存根语法已更改。这有效:

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

当我使用它时。