| Q | А
| -------------------- | ---------------
| Версия PHPUnit | 9.2.5
| Версия PHP | PHP 7.4.7 (cli) (построено: 11 июня 2020 18:33:07) (NTS)
| Способ установки | Композитор
При передаче экземпляра Exception
через dataProvider выдается исключение Uncaught ReflectionException:
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 Быстрая проверка: вы запускаете тесты в отдельном процессе, это правильно?
Чтобы передать предоставленные данные из процесса оркестрации PHPUnit в изолированный, он использует [un]serialize($data)
.
@sebastianbergmann Это известное ограничение и ожидаемое поведение?
@stemis Быстрая проверка: вы запускаете тесты в отдельном процессе, это правильно?
Чтобы передать предоставленные данные из процесса оркестрации PHPUnit в изолированный, он использует[un]serialize($data)
.
Да, это происходит только при включенном processIsolation
@stemis Спасибо за дополнительную информацию. Передача данных с использованием сериализации должна использоваться только для внешних процессов, включая файлы PHPT. ~ В связи с предстоящим рефакторингом @dataProvider
я хотел бы знать, что здесь происходит. Посмотрите, что @sebastianbergmann знает о предполагаемом поведении. ~
Ах! Спасибо за заметки о патче к вашему обновлению :)
Было бы здорово, если бы был способ передавать _any_ тип данных между процессами. Обсудим это, возможно, я смогу вставить вилку в этот механизм при рефакторинге цикла загрузки-выполнения-выгрузки поставщика данных.
Спасибо, что обратили на это мое внимание. Я отвечу здесь на следующей неделе, когда буду работать над # 4302 (рефакторинг основного цикла) и # 3736 (управление ресурсами поставщика данных).