私は rspec チュートリアルを進めていますが、次のコードの意味を確認するための助けが必要です:
@eleven_am = Time.parse("2011-1-2 11:00:00")
Time.stub(:now) { @eleven_am }
これは、2011 年 1 月 2 日ではないにもかかわらず、現在の時刻が 2011 年 1 月 2 日であるふりをすることを意味していると思います。それは何が起こっているのですか?
はい、スタブはメソッドを再定義して、テストのために決定したことを何でも実行します。通常、これらは非決定論的なメソッド (Time.now
毎回異なる値を返すため、テストが非常に困難な など) を避けるため、または現在のテストに関係のないメソッドを無視するために使用されます。
スタブを記述する方法はいくつかあります。あなたが示した例では、ブロック形式を使用しています。これにより、メソッドの戻り値を動的に決定できるため、非常に複雑なことに使用できます (基本的に、メソッドを完全に再定義できますが、これは通常は良い考えではありません! )。
「静的」スタブを作成できます (値を返すだけで、ブロック形式とは異なり、毎回新しく計算することはできません)。そのための構文がいくつかあります。
# Hash form, useful for stubbing multiple things at once
Time.stub(:now => @eleven_am, :then => @ten_am)
# and_return, which reads fluently
Time.stub(:now).and_return(@eleven_am)
あなたが示した例では、返される値は毎回同じであるため、ブロック形式は必要ありません。あとは、どちらが好きかは個人の好みの問題です!
はい、スタブ メソッドが行うことは、送信しているメッセージをインターセプトすることです。オブジェクトでそのメソッドを呼び出す代わりに、指定した値 (この場合は @eleven_am の値) を返すだけです。
他の誰かが一緒に散歩してこれに気付いた場合に備えて、警告を追加します。 Time.stub(:now)
タイムクラスのみを突き刺します。コードが日付クラスを呼び出す可能性のある何か(他のライブラリを含む)に依存している場合、それもスタブを伸ばしていることを確認する必要があります。そうしないと、テストに2つの異なるクロックがあります。