Я хотел бы записать тест с помощью simpleTest, который перестанет работать, если метод я протестирую результаты в PHP E_NOTICE
"неопределенный индекс: нечто".
Я попробовал expectError()
и expectException()
без успеха. simpleTest веб-страница указывает, что 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.