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
。