メインコンテンツまでスキップ

ヌルオブジェクトのダブル

Test doubles はデフォルトで厳格であり、許可されていないまたは期待されていないメッセージを受け取るとエラーを発生させます。double の後に as_null_object をチェーンすることで、ダブルを「緩い」ものにすることができます。明示的に許可されていないまたは期待されていないメッセージに対しては、ダブルは自身を返します。これは、任意の深さのメソッドチェーンを許可するブラックホールのヌルオブジェクトとして機能します。

as_null_object は任意の深さのメッセージチェーンを許可し、自身を返します

次の内容で "as_null_object_spec.rb" という名前のファイルがあるとします:

RSpec.describe "as_null_object" do
it "returns itself" do
dbl = double("Some Collaborator").as_null_object
expect(dbl.foo.bar.bazz).to be(dbl)
end
end

rspec as_null_object_spec.rb を実行すると、

すべての例がパスするはずです。

個々のメソッドは引き続き許可または期待できます

次の内容で "as_null_object_spec.rb" という名前のファイルがあるとします:

RSpec.describe "as_null_object" do
it "can allow individual methods" do
dbl = double("Some Collaborator", :foo => 3).as_null_object
allow(dbl).to receive(:bar).and_return(4)

expect(dbl.foo).to eq(3)
expect(dbl.bar).to eq(4)
end
end

rspec as_null_object_spec.rb を実行すると、

すべての例がパスするはずです。