No hay forma de hacerlo en una prueba unitaria. Es posible si rompe la prueba del valor de retorno y el aviso en dos pruebas diferentes.
El controlador de errores de PHPUnit detecta errores y avisos de PHP y los convierte en Excepciones, lo que por definición detiene la ejecución del programa. La función que está probando nunca regresa. Sin embargo, puede desactivar temporalmente la conversión de errores en excepciones, incluso en tiempo de ejecución.
Esto es probablemente más fácil con un ejemplo, es así, esto es lo que las dos pruebas debe ser similar:
public function testLoadFileTriggersErrorWhenFileNotFound()
{
$this->setExpectedException('PHPUnit_Framework_Error_Warning'); // Or whichever exception it is
$result = load_file('/some/non-existent/file');
}
public function testLoadFileRetunsFalseWhenFileNotFound()
{
PHPUnit_Framework_Error_Warning::$enabled = FALSE;
$result = load_file('/some/non-existent/file');
$this->assertFalse($result);
}
Esto también tiene la ventaja añadida de hacer sus pruebas más claras y más limpio autodocumentado,.
Re: Comentario: Esa es una gran pregunta, y no tenía ni idea hasta que me encontré con un par de pruebas. Parece que va a no restaurar el valor predeterminado/original, al menos a partir de PHPUnit 3.3.17 (la versión estable actual en este momento).
Por lo tanto, no me habría importado modificar lo anterior para buscar así:
public function testLoadFileRetunsFalseWhenFileNotFound()
{
$warningEnabledOrig = PHPUnit_Framework_Error_Warning::$enabled;
PHPUnit_Framework_Error_Warning::$enabled = false;
$result = load_file('/some/non-existent/file');
$this->assertFalse($result);
PHPUnit_Framework_Error_Warning::$enabled = $warningEnabledOrig;
}
Re: Segundo comentario:
Eso no es del todo cierto. Estoy mirando gestor de errores de PHPUnit, y funciona de la siguiente manera:
- Si se trata de un
E_WARNING
, utilice PHPUnit_Framework_Error_Warning
como una clase de excepción.
- Si se trata de un error o
E_NOTICE
E_STRICT
, utilice PHPUnit_Framework_Error_Notice
- Si no, utilizar
PHPUnit_Framework_Error
como la clase de excepción.
Así que, sí, los errores de la E_USER_*
no son convertidos en PHPUnit de _ADVERTENOIA * o * Clase _Notice, todavía se transforman en un genérico PHPUnit_Framework_Error
excepción.
Más ideas
Si bien depende exactamente de cómo se utiliza la función, probablemente cambien a lanzar una excepción real en lugar de desencadenar un error, si fuera yo. Sí, esto cambiaría el flujo lógico del método y el código que usa el método ... en este momento la ejecución no se detiene cuando no puede leer un archivo. Pero eso depende de usted para decidir si el archivo solicitado que no existe es verdaderamente comportamiento excepcional. Tiendo a usar excepciones mucho más que errores/advertencias/avisos, porque son más fáciles de manejar, probar y trabajar en el flujo de aplicaciones. Normalmente reservo avisos para cosas como llamadas a métodos depreciados, etc.
Gracias jason. ¿Sabe por casualidad si el valor PHPUnit_Framework_Error_Warning :: $ enabled se revierte automáticamente entre las pruebas? ¿O necesita cambiarlo manualmente a su valor original? – dellsala
Una nota sobre esta respuesta. Aunque funciona para los errores generados por las funciones y los métodos de php incorporados, no parece funcionar para los tipos de error generados por el usuario (E_USER_WARNING y E_USER_NOTICE) trigger_error. Parece que PHPUnit no admite alternar estos en el tiempo de ejecución (versión 3.3.17) – dellsala