The RSpec Book を読んでいるうちに、as_null_objectメソッドに出くわしました。なぜそれが必要なのかについて、本が提供する説明を理解できません。
... 最も簡単な方法は、二重出力に、期待するように指示したメッセージのみをリッスンし、他のメッセージを無視するように指示することです。
しかし、サンプル コードが失敗するのはなぜでしょうか? double('output')
各例で呼び出すとき、例ごとに新しい double オブジェクトを作成し、単一のメッセージを送信していませんか?
私が望むのは、コード例が失敗する理由とas_null_object
、問題にどのように対処するかについて (本よりも) 詳しい説明です。
it "sends a welcome message" do
output = double('output')
game = Game.new(output)
output.should_receive(:puts).with('Welcome to Codebreaker!')
game.start
end
it "prompts for the first guess" do
output = double('output')
game = Game.new(output)
output.should_receive(:puts).with('Enter guess:')
game.start
end
この本は、前のセクションでエラーの理由を説明しようとしていますが、やはり説明がわかりません。
puts
最初の例では、 "Welcome to Codebreaker!"を期待するよう double に指示しました。その要件は満たしましたが、「Codebreaker へようこそ!」と期待するように指示しただけです。「推測を入力してください:」については何も知りません。同様に、2 番目の例の double は「推測を入力してください:」を想定していますが、最初に取得するメッセージは「Codebreaker へようこそ」です。