8

我正在测试一段 Rails 代码,内容如下:

sleep(10.0)

在我的 RSpec 测试中,调用:

Kernel.should_receive(:sleep).exactly(1).time

失败,测试休眠了十秒钟。这使我得出结论,sleep()在 Rails 程序中没有调用Kernel.sleep(). 我通过将我的 Rails 代码更改为:

Kernel.sleep(10.0)

...之后我的 RSpec 测试通过了(并且测试没有休眠)。

这导致了一个具体和一般性的问题:

  • Rails 使用什么 sleep() 实现(我正在运行 Ruby 1.9.3 / Rails 3.2.1)?
  • 从解释器中,找到任何函数的源代码的最简单方法是什么?
4

1 回答 1

9

隐式接收器,当您未指定显式接收器时,是self,不是Kernel。(你为什么那么想?)

所以,

sleep(10.0)

大致相同

self.sleep(10.0)

完全一样

Kernel.sleep(10.0)

因此,它正在调用Kernel#sleepself不是在Kernel. 这意味着您需要self对该特定方法中的任何对象设置期望。

于 2012-07-03T12:16:33.637 回答