php - ¿Cómo detectar un error E_NOTICE de “índice no definido” en simpleTest?
exception (3)
Eso no fue realmente fácil, pero finalmente logré detectar el error E_NOTICE
que quería. Necesitaba anular el error_handler
actual para lanzar una excepción que detectaré en una declaración 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();
}
Esto parece un poco demasiado complicado tener que redeclarar el controlador de errores para lanzar una excepción solo para atraparlo. La otra parte difícil fue restaurar correctamente el error_handler cuando se detectó una excepción y no se produjo ningún error, de lo contrario, solo se mete con el manejo de errores SimpleTest.
Me gustaría escribir una prueba usando simpleTest que fallaría si el método que estoy probando da como resultado un PHP E_NOTICE
"undefined index: foo".
Intenté expectError()
y expectException()
sin éxito. La página web simpleTest indica que simpleTest no puede detectar los errores de PHP de tiempo de compilación, pero E_NOTICE
parece ser un error de tiempo de ejecución.
¿Hay alguna manera de detectar ese error y hacer que mi prueba falle si es así?
Nunca lo atraparás dentro del bloque try-catch, por suerte tenemos set_error_handler ():
<?php
function my_handle(){}
set_error_handler("my_handle");
echo $foo["bar"];
?>
Puede hacer lo que quiera dentro de la función my_handle (), o simplemente dejarlo vacío para silenciar el aviso, aunque no se recomienda. Un manejador normal debería ser así:
function myErrorHandler($errno, $errstr, $errfile, $errline)
Realmente no hay necesidad de detectar el error de aviso. Uno también podría probar el resultado de ''array_key_exists'' y luego proceder desde allí.
http://www.php.net/manual/en/function.array-key-exists.php
Prueba de falso y haz que falle.