readthedocs - PhpUnit no muestra un seguimiento de pila para un error fatal de php
phpunit tutorial (2)
PhpUnit actualmente no muestra el seguimiento de pila para los errores de PHP que ocurren en el código.
¿Cómo lo configuro para hacerlo?
Esta es una forma poco convincente pero efectiva que he encontrado para obtener un volcado de pila cuando php no da una. Tengo esto en una clase llamada DebugUtil.
/**
* This is for use when you have the UBER-LAME...
* "PHP Fatal error: Maximum function nesting level of ''100'' reached,
* aborting! in Lame.php(1273)
* ...which just craps out leaving you without a stack trace.
* At the line in the file where it finally spazzes out add
* something like...
* DebugUtil::dumpStack(''/tmp/lame'');
* It will write the stack into that file every time it passes that
* point and when it eventually blows up (and probably long before) you
* will be able to see where the problem really is.
*/
public static function dumpStack($fileName)
{
$stack = "";
foreach (debug_backtrace() as $trace)
{
if (isset($trace[''file'']) &&
isset($trace[''line'']) &&
isset($trace[''class'']) &&
isset($trace[''function'']))
{
$stack .= $trace[''file''] . ''#'' .
$trace[''line''] . '':'' .
$trace[''class''] . ''.'' .
$trace[''function''] . "/n";
}
}
file_put_contents($fileName, $stack);
}
PHPUnit utiliza una función de manejador de errores para atrapar y mostrar errores, pero del manual de PHP sobre manejadores de errores ,
Los siguientes tipos de error no se pueden manejar con una función definida por el usuario: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING y la mayor parte de E_STRICT planteada en el archivo donde se llama set_error_handler ().
Si está ejecutando pruebas en un proceso separado, PHPUnit obtendrá el error y el mensaje del intérprete, pero no habrá un seguimiento de pila disponible. Esto es simplemente una limitación del intérprete de PHP. Fatal significa fatal.