Nikhil Kuriakose
PHPUnit me permitió crear un código auxiliar de método para lanzar una excepción, usando cualquiera de los siguientes:
[->will($this->throwException(..)][1]
->willThrowException(..
Necesito probar algunos casos en los que el código auxiliar arroja errores de PHP.
¿PHPUnit admite algo como esto? ¿Alguna solución aquí?
La throwException() en la clase PHPUnit TestCase puede tomar cualquier instancia de Throwable como parámetro.
Esto significa,
->will($this->throwException(new Error()));
->will($this->throwException(new Exception()));
ambos son validos
-
Por cierto, puedes usar
willThrowException()
en cambio.– localheinz
27 de agosto de 2017 a las 13:23
-
No, willThrowException() solo puede aceptar el tipo de excepción como parámetro, no un error.
– Nikhil Kuriakose
27 de agosto de 2017 a las 13:26
-
Sólo para información, el
willThrowException()
método ahora acepta\Throwable
No solo\Exception
en PHPUnit 8 (8.2 al menos, no se probó en una versión anterior)– Etshy
25 de junio de 2019 a las 11:38
-
@NikhilKuriakose: Si esto responde a la pregunta, márquelo como “respuesta”.
– k00ni
15 de enero de 2020 a las 8:59
matt doran
Puede hacer que una función en una prueba arroje una excepción como esta:
$handlerConsentMessage = $this->getMockBuilder('YourClass')
->setMethods(array('yourMethod'))->getMock();
$handlerConsentMessage->method('yourMethod')->willThrowException(new Exception());
$handlerConsentMessage->run('functionToRun');
Ahora, cuando ejecute su función de prueba functionToRun, si alguna vez se llama a la función YourMethod, se generará una excepción.
Simplemente active un error:
$foo
->expects($this->once())
->method('bar')
->willReturnCallback(function () {
trigger_error(
'Now really is not a good time',
E_USER_ERROR
);
});
Para referencia, consulte:
-
Bien, ahora se pone interesante. Supongo que ambos comportamientos (su respuesta y la mía) darán exactamente el mismo resultado.
– Nikhil Kuriakose
27 de agosto de 2017 a las 13:24
-
Ja, el tuyo es definitivamente mejor y tiene más sentido en PHP7. Todavía no he tenido la necesidad de simular la activación de un error (en lugar de lanzar excepciones), por lo que realmente no he usado lo que sugerí aquí antes.
– localheinz
27 de agosto de 2017 a las 13:26
-
Pero, esto es bueno. Estuve buscando respuestas durante horas, y de repente tengo dos 🙂 ¡Gracias!
– Nikhil Kuriakose
27 de agosto de 2017 a las 13:27
-
¡Me alegra que te guste! A menudo tiene sentido preguntarle a alguien, ¡jeje!
– localheinz
27 de agosto de 2017 a las 13:28
El código de alta calidad no produce ningún error de PHP (aviso, advertencia, fatal, errores de análisis) durante el trabajo normal. Si aún produce errores, debe intente detectar tales casos extremos y lanzar excepciones / devolver un resultado diferente. Entonces estas excepciones son fácilmente burlables en las pruebas de PHPUnit.
Otra solución, si no es posible modificar la clase probada– es definir el detector de errores dentro de su prueba, consulte set_error_handler. La lógica debería ser la siguiente:
- El método probado genera algún error, por ejemplo, una advertencia
- La advertencia es capturada por set_error_handler dentro de su prueba.
- Dentro de la devolución de llamada de set_error_handler, configura alguna variable para indicar que la advertencia fue atrapada. (podría ser alguna propiedad estática u otro almacenamiento)
- Al final de la prueba, afirma que la propiedad estática tiene cierto valor = significa que se generó una advertencia.
¿Qué quieres decir con eso? Puedes lanzar excepciones, y usted puede generar errores
– localheinz
27 de agosto de 2017 a las 13:17
Mi semántica puede estar apagada. Pero, quería hacer por errores de lanzamiento/disparador de stub. Yo mismo lo respondí.
– Nikhil Kuriakose
27 de agosto de 2017 a las 13:21
Tenga en cuenta que esto funciona solo en PHP 7 y versiones posteriores, consulte php.net/manual/en/language.errors.php7.php.
– localheinz
27 de agosto de 2017 a las 13:24