php exception simpletest

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)