fea*_*ool 8 ruby ruby-on-rails-3
我正在测试一段Rails代码:
sleep(10.0)
Run Code Online (Sandbox Code Playgroud)
在我的RSpec测试中,调用:
Kernel.should_receive(:sleep).exactly(1).time
Run Code Online (Sandbox Code Playgroud)
失败了,测试睡了十秒钟.这使我得出结论,sleep()在Rails程序中没有调用Kernel.sleep().我通过将我的Rails代码更改为:
Kernel.sleep(10.0)
Run Code Online (Sandbox Code Playgroud)
...之后我的RSpec测试通过(测试没有睡觉).
这导致了一个具体的和一般性的问题:
当你没有指定一个明确的接收器时,隐式接收器self不是Kernel.(你为什么那么想?)
所以,
sleep(10.0)
Run Code Online (Sandbox Code Playgroud)
大致相同
self.sleep(10.0)
Run Code Online (Sandbox Code Playgroud)
并没有完全一样
Kernel.sleep(10.0)
Run Code Online (Sandbox Code Playgroud)
因此,它呼吁Kernel#sleep对self不上Kernel.这意味着您需要self对该特定方法中的任何对象设置期望.