1つの単体テスト内でこれを行う方法はありません。戻り値のテストと通知を2つの異なるテストに分割すると可能です。
PHPUnitのエラーハンドラーは、PHPエラーをキャッチして通知し、それらを例外に変換します。これは、定義上、プログラムの実行を停止します。テストしている関数が返されることはありません。ただし、実行時であっても、エラーから例外への変換を一時的に無効にすることができます。
これは例を使用するとおそらく簡単なので、2つのテストは次のようになります。
public function testLoadFileTriggersErrorWhenFileNotFound()
{
$this->setExpectedException('PHPUnit_Framework_Error_Warning'); // Or whichever exception it is
$result = load_file('/some/non-existent/file');
}
public function testLoadFileRetunsFalseWhenFileNotFound()
{
PHPUnit_Framework_Error_Warning::$enabled = FALSE;
$result = load_file('/some/non-existent/file');
$this->assertFalse($result);
}
これには、テストをより明確で、よりクリーンで、自己文書化するという追加のボーナスもあります。
Re:コメント:
それは素晴らしい質問です。いくつかのテストを実行するまで、私にはわかりませんでした。少なくともPHPUnit3.3.17(現在の安定版リリース)では、デフォルト/元の値を復元しないように見えます。
だから、私は実際に上記を次のように修正します:
public function testLoadFileRetunsFalseWhenFileNotFound()
{
$warningEnabledOrig = PHPUnit_Framework_Error_Warning::$enabled;
PHPUnit_Framework_Error_Warning::$enabled = false;
$result = load_file('/some/non-existent/file');
$this->assertFalse($result);
PHPUnit_Framework_Error_Warning::$enabled = $warningEnabledOrig;
}
Re:2番目のコメント:
それは完全に真実ではありません。PHPUnitのエラーハンドラーを見ていますが、次のように機能します。
- の場合は、例外クラスとして
E_WARNING
使用します。PHPUnit_Framework_Error_Warning
E_NOTICE
またはE_STRICT
エラーの場合は、PHPUnit_Framework_Error_Notice
PHPUnit_Framework_Error
それ以外の場合は、例外クラスとして使用します。
したがって、はい、エラーはE_USER_*
PHPUnitの*_Warningまたは*_Noticeクラスに変換されませんが、それでも一般的なPHPUnit_Framework_Error
例外に変換されます。
さらなる考察
関数の使用方法によって異なりますが、私であれば、エラーをトリガーするのではなく、実際の例外をスローするように切り替えると思います。はい、これによりメソッドのロジックフローが変更され、メソッドを使用するコードが変更されます...現在、ファイルを読み取れないときに実行が停止することはありません。しかし、要求されたファイルが存在しないことが本当に例外的な動作であるかどうかを判断するのはあなた次第です。例外は、アプリケーションフローの処理、テスト、および作業が簡単であるため、エラー/警告/通知よりもはるかに多く使用する傾向があります。私は通常、減価償却されたメソッド呼び出しなどの通知を予約します。