Phpunit: Pasar una instancia de excepción a través de DataProvider arroja ReflectionException

Creado en 1 jul. 2020  ·  3Comentarios  ·  Fuente: sebastianbergmann/phpunit

| Q | A
| -------------------- | ---------------
| Versión PHPUnit | 9.2.5
| Versión PHP | PHP 7.4.7 (cli) (construido: 11 de junio de 2020 18:33:07) (NTS)
| Método de instalación | Compositor

Resumen


Al pasar una instancia Exception través de un dataProvider, se lanza una ReflectionException no detectada:

Comportamiento actual

Fatal error: Uncaught Exception: Serialization of 'ReflectionClass' is not allowed in /var/www/html/vendor/phpunit/phpunit/src/Framework/TestCase.php:723
Stack trace:
#0 /var/www/html/vendor/phpunit/phpunit/src/Framework/TestCase.php(723): serialize(Array)
#1 /var/www/html/vendor/phpunit/phpunit/src/Framework/TestSuite.php(638): PHPUnit\Framework\TestCase->run(Object(PHPUnit\Framework\TestResult))
#2 /var/www/html/vendor/phpunit/phpunit/src/Framework/TestSuite.php(638): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#3 /var/www/html/vendor/phpunit/phpunit/src/Framework/TestSuite.php(638): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#4 /var/www/html/vendor/phpunit/phpunit/src/Framework/TestSuite.php(638): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#5 /var/www/html/vendor/phpunit/phpunit/src/TextUI/TestRunner.php(657): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#6 /var/www/html/vendor/phpunit/phpunit/src/TextUI/Command in /var/www/html/vendor/phpunit/phpunit/src/Framework/TestCase.php on line 723

Como reproducir

processIsolation="true"

class MyTest extends \PHPUnit\Framework\TestCase
{
    /**
     * <strong i="20">@dataProvider</strong> thisMethodDataProvider
     */
    public function testThisMethod(\Exception $expectedException): void
    {
        // ...
    }

    public function thisMethodDataProvider()
    {
        return [
            [new \Exception()],
        ];
    }
}
typbug

Todos 3 comentarios

@stemis Comprobación rápida: está ejecutando las pruebas en un proceso separado, ¿es correcto?
Para pasar los datos proporcionados del proceso PHPUnit de orquestación al aislado, utiliza [un]serialize($data) .

@sebastianbergmann ¿Es esta una limitación conocida y un comportamiento esperado?

@stemis Comprobación rápida: está ejecutando las pruebas en un proceso separado, ¿es correcto?
Para pasar los datos proporcionados del proceso PHPUnit de orquestación al aislado, utiliza [un]serialize($data) .

Sí, esto solo sucede con processIsolation activado

@stemis Gracias por la información adicional. La transmisión de datos mediante serialización solo debe usarse para procesos externos, incluidos los archivos PHPT. ~ Con la próxima refactorización de @dataProvider me gustaría saber qué está pasando aquí. Vea qué sabe @sebastianbergmann sobre el comportamiento previsto. ~

¡Ah! Gracias por las notas del parche de tu actualización :)
Sería genial si hubiera una manera de pasar _cualquier_ tipo de datos entre procesos. Discutiré esto, tal vez pueda colocar una bifurcación en este mecanismo mientras refactorizo ​​el ciclo de carga-ejecución-descarga del proveedor de datos.

Gracias por informarme sobre esto. Responderé aquí en algún momento de la próxima semana cuando trabaje en el # 4302 (refactorización del bucle principal) y el # 3736 (gestión de recursos del proveedor de datos).

¿Fue útil esta página
0 / 5 - 0 calificaciones