我正在测试一段Rails代码:
sleep(10.0)
在我的RSpec测试中,调用:
Kernel.should_receive(:sleep).exactly(1).time
失败了,测试睡了十秒钟.这使我得出结论,Rails程序中的sleep()不会调用Kernel.sleep().我通过将我的Rails代码更改为:
Kernel.sleep(10.0)
…之后我的RSpec测试通过了(测试没有睡觉).
这导致了一个具体的和一般性的问题:
> Rails使用什么sleep()实现(我正在运行Ruby 1.9.3 / Rails 3.2.1)?
>从解释器中,找到任何函数源代码的最简单方法是什么?
解决方法
当您未指定显式接收器时,隐式接收器是self,而不是Kernel. (你为什么那么想?)
所以,
sleep(10.0)
大致相同
self.sleep(10.0)
并没有完全一样
Kernel.sleep(10.0)
因此,它在自己上调用Kernel#sleep
而不在内核上调用.这意味着您需要对该特定方法中的任何对象设置期望.