多くの場合、1 つの結果が 2 つの異なる結果になり、テスト ダブルでテストする必要があります。たとえば、ネットワーク接続が成功した場合、メッセージをログに記録し、リソースを別のオブジェクトに渡して内部に保存したいと考えています。一方で、これら2つを1つのテストに入れるのは不潔に感じます。たとえば、次のコードは失敗します。
describe SomeClass do
let(:logger) { double('Logger') }
let(:registry) { double('Registry') }
let(:cut) { SomeClass.new }
let(:player) { Player.new }
describe "#connect" do
context "connection is successful" do
it "should log info" do
logger.should_receive(:info).with('Player connected successfully')
cut.connect player
end
it "should register player" do
registry.should_receive(:register).with(player)
cut.connect player
end
end
end
end
各テストで、他のテストの関数が呼び出される可能性があることを指定できますが、それは不必要な重複のように見えます。その場合、私はむしろこれを1つのテストにしたいと思います。
また、メソッドを呼び出してはならないことがテストで明示されていないことも好きではありません。
明示的に指定されていない呼び出しを自動的に拒否する代わりに、明示的な「should_not_receive」メッセージを持つ代替案について知っている人はいますか?