Phpunit: La transmission d'une instance d'exception via DataProvider lève ReflectionException

Créé le 1 juil. 2020  ·  3Commentaires  ·  Source: sebastianbergmann/phpunit

| Q | UNE
| -------------------- | ---------------
| Version de PHPUnit | 9.2.5
| Version PHP | PHP 7.4.7 (cli) (construit: 11 juin 2020 18:33:07) (NTS)
| Méthode d'installation | Compositeur

Résumé


Lors du passage d'une instance Exception via un dataProvider, une exception ReflectionException Uncaught est levée:

Comportement actuel

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

Comment reproduire

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

Tous les 3 commentaires

@stemis Vérification rapide: vous exécutez les tests dans un processus séparé, est-ce correct?
Afin de transmettre les données fournies du processus d'orchestration PHPUnit au processus isolé, il utilise [un]serialize($data) .

@sebastianbergmann S'agit-il d'une limitation connue et d'un comportement attendu?

@stemis Vérification rapide: vous exécutez les tests dans un processus séparé, est-ce correct?
Afin de transmettre les données fournies du processus d'orchestration PHPUnit au processus isolé, il utilise [un]serialize($data) .

Oui, cela ne se produit que lorsque processIsolation activé

@stemis Merci pour les informations supplémentaires. La transmission de données à l'aide de la sérialisation ne doit être utilisée que pour les processus externes, y compris les fichiers PHPT. ~ Avec le prochain refactoring @dataProvider j'aimerais savoir ce qui se passe ici. Découvrez ce que @sebastianbergmann sait du comportement prévu. ~

Ah! Merci pour les notes de patch de votre mise à jour :)
Ce serait formidable s'il y avait un moyen de passer le type de données _any_ entre les processus. Je vais discuter de cela, peut-être que je peux coller une fourchette dans ce mécanisme tout en refactorisant le cycle de chargement-exécution-déchargement du fournisseur de données.

Merci d'avoir porté ceci à mon attention. Je répondrai ici la semaine prochaine lorsque je travaillerai sur # 4302 (refactoring de la boucle principale) et # 3736 (gestion des ressources du fournisseur de données).

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

keradus picture keradus  ·  4Commentaires

sebastianbergmann picture sebastianbergmann  ·  3Commentaires

dciancu picture dciancu  ·  3Commentaires

gellis picture gellis  ·  4Commentaires

keradus picture keradus  ·  3Commentaires