のPHPUnit ドキュメントによると@expectedExceptionMessage
、文字列は実際Exception
にスローされた文字列の部分文字列のみである必要があります。
私の検証方法の 1 つでは、エラーが発生するたびに配列項目がプッシュException
され、エラーの配列を内破することによって最終的なメッセージが表示されます。
class MyClass
{
public function validate($a, $b, $c, $d)
{
if($a < $b) $errors[] = "a < b.";
if($b < $c) $errors[] = "b < c.";
if($c < $d) $errors[] = "c < d.";
if(count($errors) > 0) throw new \Exception(trim(implode(" ", $errors)));
}
}
ここでの問題は、PHPUnit テスト メソッドでさまざまな組み合わせをチェックすることです。これにより、失敗するつもりのテストが成功します。
/**
* @expectedException \Exception
* @expectedExceptionMessage a < b.
*/
public function testValues_ALessBOnly()
{
$myClass = new MyClass()
$myClass->validate(1, 2, 4, 3);
}
メッセージの文字列Exception
は実際にはありますが"a < b. b < c."
、このテストは引き続きパスします。メッセージが期待どおりではないため、このテストは失敗するつもりです。
PHPUnitで部分文字列ではなく正確な文字列を期待する方法はありますか? 次のことは避けたいと思います。
public function testValues_ALessBOnly()
{
$myClass = new MyClass()
$fail = FALSE;
try
{
$myClass->validate(1, 2, 4, 3);
}
catch(\Exception $e)
{
$fail = TRUE;
$this->assertEquals($e->getMessage(), "a < b.";
}
if(!$fail) $this->fail("No Exceptions were thrown.");
}