Rails使用什么sleep()?

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测试通过(测试没有睡觉).

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

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

Jör*_*tag 9

当你没有指定一个明确的接收器时,隐式接收器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#sleepself不上Kernel.这意味着您需要self对该特定方法中的任何对象设置期望.