Da Sie hier sind, wissen Sie wahrscheinlich genau, dass PHPUnit 8+ gängige Template-Methoden wie setUp()
oder tearDown()
erfordert, um eine void
Rückgabetypdeklaration zu haben, wobei diese Methoden natürlich alles unter PHP 7.1 kaputt machen.
Obwohl es keine große Sache ist, Ihren Code mit Hilfe von Programmen wie PHP-CS-Fixer oder Rector automatisch so zu aktualisieren, dass er diese Rückgabetypdeklaration verwendet, könnte es aus irgendwelchen unglücklichen (aber hoffentlich lukrativen) Gründen zu einem Problem werden , müssen Sie sicherstellen, dass Ihr Code unter PHP 7.0 oder PHP 5.6 funktioniert, und gleichzeitig das Beste nutzen, was Ihnen die neueren Versionen von PHPUnit bieten können.
In diesem Fall treten zwei Probleme auf. Eine, neuere Versionen von PHPUnit haben keine alten Assertions, aber Sie können einen Weg finden, dies zu umgehen, und eine andere, wie bereits erwähnt, neuere Versionen von PHPUnit erfordern void
Rückgabetypdeklarationen für die praktischen Vorlagenmethoden, und dann stecken Sie wegen des Umschreibens fest Das Funktionieren von Tests ohne diese Vorlagenmethoden ist sehr mühsam und möglicherweise sogar unmöglich. Und dann kommt diese kleine Bibliothek, um Ihren Tag zu retten!
composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"
Aktualisieren Sie zunächst Ihre Tests so, dass sie von LegacyPHPUnitTestCase
anstelle von PHPUnitFrameworkTestCase
erweitert werden:
- class MyTest extends PHPUnitFrameworkTestCase
+ class MyTest extends LegacyPHPUnitTestCase
Wo Sie dann die Methode setUp(): void
template verwenden mussten, verwenden Sie die Methode doSetUp()
und lassen alle Rückgabetypen vollständig abwärtskompatibel weg.
- protected function setUp(): void
+ protected function doSetUp()
Für die meisten anderen Vorlagenmethoden gibt es ähnliche Ersetzungen:
- 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()
Verfahren | Ersatz |
---|---|
setUpBeforeClass(): void | doSetUpBeforeClass() |
tearDownAfterClass(): void | doTearDownAfterClass() |
setUp(): void | doSetUp() |
tearDown(): void | doTearDown() |
assertPreConditions(): void | doAssertPreConditions() |
assertPostConditions(): void | doAssertPostConditions() |
Zukünftige Versionen werden wahrscheinlich demselben Muster folgen.
Obwohl diese Bibliothek den lästigsten Teil des Problems löst, gibt es andere Teile, für deren Abdeckung die Bibliothek nicht konzipiert wurde. Zum Beispiel:
assertContains
mit Zeichenfolgen, andere nicht.expectExceptionMessageRegExp
, während in anderen dieselbe Methode expectExceptionMessageMatches
heißt.Es gibt Polyfills für diese geänderten Methoden (siehe unten), aber es sollte keine große Sache sein, ein Ad-hoc-Polyfill nur für die Methoden zu schreiben, die Sie benötigen. Z.B:
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 ();
}
Wenn es für diese und andere Methoden mehrere modulare (und nicht) Multiversions-Polyfills gibt:
yoast/phpunit-polyfills
.phpunitgoodpractices/polyfill
.