Comme vous êtes ici, vous savez probablement que PHPUnit 8+ nécessite des méthodes de modèle courantes comme setUp()
ou tearDown()
pour avoir une déclaration de type de retour void
, lesquelles méthodes cassent naturellement tout ce qui est en dessous de PHP 7.1.
Bien que ce ne soit pas grave de mettre automatiquement à jour votre code pour utiliser ces déclarations de type de retour avec l'aide de PHP-CS-Fixer ou Rector, cela pourrait devenir un problème si, pour une raison malheureuse (mais, espérons-le, lucrative) , vous devez vous assurer que votre code fonctionne sous PHP 7.0 ou PHP 5.6, tout en voulant utiliser le meilleur que le monde peut vous offrir dans les versions les moins récentes de PHPUnit.
Dans ce cas, vous aurez deux problèmes. Une version plus récente de PHPUnit n'a pas d'anciennes assertions, mais vous pouvez trouver un moyen de contourner ce problème, et une autre, comme mentionné, les versions plus récentes de PHPUnit nécessitent des déclarations de type de retour void
pour les méthodes de modèle pratiques, et vous êtes alors bloqué car la réécriture les tests fonctionnent sans ces méthodes de modèle est une tâche très pénible et pourrait même être impossible. Et puis cette petite bibliothèque vient vous sauver la mise !
composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"
Tout d’abord, mettez à jour vos tests pour les étendre depuis LegacyPHPUnitTestCase
au lieu de PHPUnitFrameworkTestCase
:
- class MyTest extends PHPUnitFrameworkTestCase
+ class MyTest extends LegacyPHPUnitTestCase
Ensuite, là où vous deviez utiliser la méthode setUp(): void
template, utilisez la méthode doSetUp()
, en omettant tous les types de retour d'une manière entièrement rétrocompatible.
- protected function setUp(): void
+ protected function doSetUp()
Il existe des remplacements similaires pour la plupart des autres méthodes de modèle :
- public static function setUpBeforeClass(): void
+ public static function doSetUpBeforeClass()
- public static function tearDownAfterClass(): void
+ public static function doTearDownAfterClass()
- protected function setUp(): void
+ protected function doSetUp()
- protected function tearDown(): void
+ protected function doTearDown()
- protected function assertPreConditions(): void
+ protected function doAssertPreConditions()
- protected function assertPostConditions(): void
+ protected function doAssertPostConditions()
Méthode | Remplacement |
---|---|
setUpBeforeClass(): void | doSetUpBeforeClass() |
tearDownAfterClass(): void | doTearDownAfterClass() |
setUp(): void | doSetUp() |
tearDown(): void | doTearDown() |
assertPreConditions(): void | doAssertPreConditions() |
assertPostConditions(): void | doAssertPostConditions() |
Les versions futures suivront probablement le même modèle.
Bien que cette bibliothèque résolve la partie la plus ennuyeuse du problème, il existe d’autres parties que la bibliothèque n’a pas été conçue pour couvrir. Par exemple:
assertContains
avec des chaînes, tandis que d'autres ne le font pas.expectExceptionMessageRegExp
, tandis que dans d'autres, la même méthode est appelée expectExceptionMessageMatches
.Il existe des polyfills pour ces méthodes modifiées (voir ci-dessous), mais cela ne devrait pas être un problème d'écrire un polyfill ad hoc uniquement pour les méthodes dont vous avez besoin. Par exemple :
public function __call ( $ method , $ args )
{
if ( $ method === ' assertStringContainsString ' ) {
$ this -> assertContains (... $ args );
}
if ( $ method === ' assertIsBool ' ) {
$ this -> assertTrue ( is_bool ( $ args [ 0 ]));
}
if ( $ method === ' expectExceptionMessageRegExp ' ) {
$ this -> expectExceptionMessageMatches (... $ args );
}
throw new InvalidArgumentException ();
}
S'il existe plusieurs polyfills modulaires (et non) multi-versions pour celles-ci, et d'autres méthodes :
yoast/phpunit-polyfills
.phpunitgoodpractices/polyfill
.