8

次のような Rails コードをテストしています。

sleep(10.0)

私のRSpecテストでは、以下を呼び出します:

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

失敗し、テストは 10 秒間スリープ状態になりました。sleep()これにより、Rails プログラムでは が呼び出されていないと結論付けましたKernel.sleep()。Railsコードを次のように変更して、これを確認しました。

Kernel.sleep(10.0)

...その後、RSpec テストに合格しました (そして、テストはスリープしませんでした)。

これは、特定の一般的な質問につながります。

  • Rails は sleep() のどの実装を使用しますか (私は Ruby 1.9.3 / Rails 3.2.1 を実行しています)?
  • インタープリターから、関数のソース コードを見つける最も簡単な方法は何ですか?
4

1 に答える 1

9

明示的な受信者を指定しない場合、暗黙的な受信者は is self, notKernelです。(どうしてそんなことを考えるのか?)

そう、

sleep(10.0)

とほぼ同じです

self.sleep(10.0)

まったく同じではありません

Kernel.sleep(10.0)

したがって、それは on ではなく on を呼び出しKernel#sleepselfKernelます。selfつまり、その特定のメソッドに含まれるオブジェクトに期待値を設定する必要があります。

于 2012-07-03T12:16:33.637 に答える