| 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
Ao passar uma instância Exception
por meio de um dataProvider, uma exceção ReflectionException não capturada é lançada:
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
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()],
];
}
}
@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).