Métodos burlones para lanzar Error phpunit

3 minutos de lectura

Avatar de usuario de Nikhil Kuriakose
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í?

  • ¿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

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


Avatar de usuario de Matt Doran
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:

  1. El método probado genera algún error, por ejemplo, una advertencia
  2. La advertencia es capturada por set_error_handler dentro de su prueba.
  3. 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)
  4. Al final de la prueba, afirma que la propiedad estática tiene cierto valor = significa que se generó una advertencia.

¿Ha sido útil esta solución?