phpunit legacy adapter
8.2.2
如您在這裡,您可能很清楚 PHPUnit 8+ 需要常見的模板方法(如setUp()
或tearDown()
來具有void
返回類型聲明,這些方法自然會破壞 PHP 7.1 以下的任何內容。
雖然在 PHP-CS-Fixer 或 Rector 等的幫助下自動更新程式碼以使用這些返回類型聲明並不是什麼大問題,但如果出於任何不幸(但希望有利可圖)的原因,它可能會成為一個問題,您必須確保您的程式碼在PHP 7.0 或PHP 5.6 下運行,同時想要使用最好的世界可以為您提供PHPUnit 的較新版本。
在這種情況下,您將遇到兩個問題。其一,較新版本的 PHPUnit 沒有舊的斷言,但您可以找到解決此問題的方法,而另一個,如前所述,較新版本的 PHPUnit 需要void
返回類型聲明才能方便的模板方法,然後您就會陷入困境,因為重寫在沒有這些模板方法的情況下進行測試是一個很大的痛苦,甚至可能是不可能的。然後這個小圖書館就能拯救你的日子了!
composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"
首先,更新您的測試以從LegacyPHPUnitTestCase
擴展而不是PHPUnitFrameworkTestCase
:
- class MyTest extends PHPUnitFrameworkTestCase
+ class MyTest extends LegacyPHPUnitTestCase
然後,在必須使用setUp(): void
模板方法的地方,使用doSetUp()
方法,以完全向後相容的方式省略所有任何返回類型。
- protected function setUp(): void
+ protected function doSetUp()
大多數其他模板方法都有類似的替換:
- 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()
方法 | 替代品 |
---|---|
setUpBeforeClass(): void | doSetUpBeforeClass() |
tearDownAfterClass(): void | doTearDownAfterClass() |
setUp(): void | doSetUp() |
tearDown(): void | doTearDown() |
assertPreConditions(): void | doAssertPreConditions() |
assertPostConditions(): void | doAssertPostConditions() |
未來的版本可能會遵循相同的模式。
儘管這個庫解決了問題中最煩人的部分,但該庫還沒有設計涵蓋其他部分。例如:
assertContains
與字串一起使用,而其他版本則不允許。expectExceptionMessageRegExp
,而在其他版本中,相同的方法稱為expectExceptionMessageMatches
。這些更改的方法有膩子填充(見下文),但僅為您需要的方法編寫一個臨時膩子填充物應該不是什麼大問題。例如:
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 ();
}
如果這些方法和其他方法有多個模組化(而不是)多版本填充:
yoast/phpunit-polyfills
。phpunitgoodpractices/polyfill
。