Phpunit: Passar instância Exception via DataProvider lança ReflectionException

Criado em 1 jul. 2020  ·  3Comentários  ·  Fonte: sebastianbergmann/phpunit

| Q | UMA
| -------------------- | ---------------
| Versão PHPUnit | 9.2.5
| Versão PHP | PHP 7.4.7 (cli) (construído: 11 de junho de 2020 18:33:07) (NTS)
| Método de instalação | Compositor

Resumo


Ao passar uma instância Exception por meio de um dataProvider, uma exceção ReflectionException não capturada é lançada:

Comportamento atual

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 reproduzir

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 comentários

@stemis Verificação rápida: você está executando os testes em um processo separado, correto?
Para passar os dados fornecidos pelo processo de orquestração do PHPUnit para o isolado, ele usa [un]serialize($data) .

@sebastianbergmann Esta é uma limitação conhecida e um comportamento esperado?

@stemis Verificação rápida: você está executando os testes em um processo separado, correto?
Para passar os dados fornecidos pelo processo de orquestração do PHPUnit para o isolado, ele usa [un]serialize($data) .

Sim, isso só acontece com processIsolation ativado

@stemis Obrigado pelas informações adicionais. A transmissão de dados usando a serialização deve ser usada apenas para processos externos, incluindo arquivos PHPT. ~ Com a próxima refatoração @dataProvider , gostaria de saber o que está acontecendo aqui. Veja o que @sebastianbergmann sabe sobre o comportamento pretendido. ~

Ah! Obrigado pelas notas de patch para sua atualização :)
Eu seria ótimo se houvesse uma maneira de passar _qualquer_ tipo de dados entre os processos. Vou discutir isso, talvez eu possa colocar uma bifurcação nesse mecanismo enquanto refatoro o ciclo de carga-execução-descarregamento do provedor de dados.

Obrigado por chamar minha atenção para isso. Responderei aqui na próxima semana, quando trabalhar em # 4302 (refatoração do loop principal) e # 3736 (gerenciamento de recursos do provedor de dados).

Esta página foi útil?
0 / 5 - 0 avaliações