SimpleTestで「未定義のインデックス」e_noticeエラーをキャッチする方法
-
16-09-2020 - |
質問
SimpleTestを使用してテストを作成したいと思います。メソッドがテストしているメソッドがPHP E_NOTICE
"未定義のインデックス:foo"を維持します。
私は成功せずにexpectError()
とexpectException()
を試しました。SimpleTest Webページは、SimpleTestがコンパイル時PHPエラーをキャッチできないことを示しますが、E_NOTICE
は実行時間エラーのようです。
そのようなエラーを引く方法はあり、それで私のテストに失敗する方法は?
解決
それは本当に簡単ではありませんでしたが、私は望んでいたE_NOTICE
エラーを捉えることができました。現在のerror_handler
を上書きするために、try{}
ステートメントにキャッチする例外をスローする必要がありました。
function testGotUndefinedIndex() {
// Overriding the error handler
function errorHandlerCatchUndefinedIndex($errno, $errstr, $errfile, $errline ) {
// We are only interested in one kind of error
if ($errstr=='Undefined index: bar') {
//We throw an exception that will be catched in the test
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
return false;
}
set_error_handler("errorHandlerCatchUndefinedIndex");
try {
// triggering the error
$foo = array();
echo $foo['bar'];
} catch (ErrorException $e) {
// Very important : restoring the previous error handler
restore_error_handler();
// Manually asserting that the test fails
$this->fail();
return;
}
// Very important : restoring the previous error handler
restore_error_handler();
// Manually asserting that the test succeed
$this->pass();
}
.
これは、それをキャッチするためだけに例外をスローするためにエラーハンドラを再分解しなければならない少し過度に複雑なようです。他のハード部分は、例外がキャッチされたときにERROR_HANDLERを正しく復元し、エラーが発生しなかった場合、SimpleTestエラー処理を扱うだけです。
他のヒント
通知エラーを捉える必要はありません。'Array_Key_Exists'の結果をテストしてから、そこから続行することもできます。
http://www.php.net/manual./ en / function.array-key-exists.php
あなたは幸いなことにset_error_handler()を持っています:
<?php
function my_handle(){}
set_error_handler("my_handle");
echo $foo["bar"];
?>
.
my_handle()関数内で欲しいものは何でもすることができます。通常のハンドラは次のようにする必要があります。
function myErrorHandler($errno, $errstr, $errfile, $errline)
.