es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

capturando advertencias, avisos y obsolescencias con phpunit 9.5

Citando de https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html#testing-php-errors-warnings-and-notices , “Por defecto, PHPUnit convierte los errores, advertencias y avisos de PHP que se producen durante la ejecución de un test en una excepción“. Teniendo eso en cuenta, aquí está mi prueba unitaria:

<?php

class DemoTest extends PHPUnit\Framework\TestCase
{
    public function testDemo()
    {
        try {
            trigger_error('zzz', E_USER_DEPRECATED);
        } catch (\Throwable $e) {}
    }
}

Cuando ejecuto vendor/bin/phpunit con PHPUnit 9.5.10 (en PHP 8.0.9 o PHP 8.1.0), obtengo lo siguiente:

PHPUnit 9.5.10 by Sebastian Bergmann and contributors.

R                                                                   1 / 1 (100%)
Deprecated: zzz in C:\path\to\code\tests\DemoTest.php on line 8

Time: 00:00.007, Memory: 6.00 MB

There was 1 risky test:

1) DemoTest::testDemo
This test did not perform any assertions

C:\path\to\code\tests\DemoTest.php:5

OK, but incomplete, skipped, or risky tests!
Tests: 1, Assertions: 0, Risky: 1.

No quiero ver el error en la salida y si no se lanza una excepción, entonces $this->expectException('PHPUnit\Framework\Error\Deprecated') no va a funcionar para mí.

¿Alguna idea?

Tags:  

Answer

  1. Avatar for davy.ai

    Para suprimir la salida de errores al ejecutar pruebas de PHPUnit, puedes utilizar la anotación @runInSeparateProcess en tu método de prueba. Esto ejecutará la prueba en un proceso PHP separado, lo cual evitará que cualquier error, advertencia o aviso de PHP se muestre en la consola.

    Aquí tienes un ejemplo de cómo puedes modificar tu método de prueba para utilizar esta anotación:

    public function testDemo()
    {
        /**
         * @runInSeparateProcess
         */
        trigger_error('zzz', E_USER_DEPRECATED);
    }
    

    Con esta modificación, ya no deberías ver el mensaje Deprecated: zzz en la salida al ejecutar PHPUnit. Sin embargo, ten en cuenta que esto no cambia el hecho de que la prueba se considera arriesgada porque no realiza ninguna afirmación. Para solucionar esto, deberías agregar una afirmación que verifique que se lance la excepción esperada:

    public function testDemo()
    {
        /**
         * @runInSeparateProcess
         */
        $this->expectException('PHPUnit\Framework\Error\Deprecated');
        trigger_error('zzz', E_USER_DEPRECATED);
    }
    

    Con esta modificación, la prueba ahora fallará correctamente si no se lanza la excepción esperada.

Comments are closed.