Doctrineモデルで関連オブジェクトをコレクションに追加するメソッドを作成していますが、そのコレクションに重複オブジェクトが追加されたときに例外をスローしたいとします。ここでセットに複製を追加しようとすると、どのような例外がスローされますか?
はテスト(秒)です:まず
public function testFluentInterface()
{
$sport = new Sport();
$this->assertSame($sport, $sport->addCode('ANY'),
'Expected Sport to implement fluent interface.'
);
}
public function testCannotAddSameCodeMoreThanOnce()
{
$code = 'BAZ';
$sport = new Sport();
$sport->addCode($code);
try
{
$sport->addCode($code);
$this->fail(
'Expected error when trying to add the same code to a sport more than once.'
);
}
catch(/*SomeKindOf*/Exception $e)
{
}
}
、私はOverflowException
が、この場合にスローされることが適切かもしれないと思ったが、私は「この値が既に存在する」かどうかは確かではありませんよ
要素をフルコンテナに追加すると例外がスローされます。
ありUnexpectedValueException
だが、それは間違った種類の変数により適用可能であると思わ:値は、値のセットと一致しない場合
例外がスローされます。通常、これは、関数が別の関数を呼び出し、戻り値が算術またはバッファー関連のエラーを含まない特定のタイプまたは値であることを期待する場合に発生します。
私はいつもLogicException
を使用することができますが、それはこのユースケースのために少しの一般的なようだ:プログラム・ロジックのエラーを表し
例外。このような種類の例外は、コード内の修正に直接つながるはずです。
ここでより適切な選択肢がありますか?私の観察は正しいのですか?一意の値を含むコレクションに複製を追加しようとするときにスローする最も適切なSPL例外は何ですか?
'addCode()'が何をするのか分かりませんが、重複を黙って無視するか例外を発生させるかは、どれほど危険なのかが分かります。 'addCode()'が同じパラメータで複数回呼び出されても安全に何もできない場合、これは開発者にとって驚くべき振る舞いではありません。あなたはこの条件をまったく指定する必要はないと思います。例外または戻り値もしユーザー*が本当に知っている必要があれば、 'hasCode()'を使うことができます。しかし、このメソッドがより危険で、失敗が大きな問題である場合は、例外をスローします。とにかく流暢に使うのは危険です。 –
これにより、元のテストの性質も変わることに注意してください。パブリックインターフェイスをテストする必要はなくなりますが、コードが2度追加されていないことを保証するためにオブジェクトの内部状態をテストする必要があります。 –