sanmai/phpunit-legacy-adapter

PHPUnit 旧版本适配器

8.2.2 2023-05-07 13:59 UTC

This package is auto-updated.

Last update: 2024-09-07 17:02:55 UTC


README

既然您在这里,您可能很清楚PHPUnit 8+需要common template methodssetUp()tearDown()void返回类型声明,这些方法自然破坏了低于PHP 7.1的所有内容。

尽管使用类似PHP-CS-FixerRector这样的工具自动更新代码以使用这些返回类型声明不是什么大问题,但如果由于某种不幸(但希望有利可图)的原因,您必须确保代码在PHP 7.0或PHP 5.6下运行,同时还想使用较新版本的PHPUnit所能提供的最佳功能,那么可能会成为一个问题。

在这种情况下,您将面临两个问题。一是,PHPUnit的新版本没有旧断言,但您可以找到一种方法来解决这个问题;二是,如前所述,PHPUnit的新版本要求方便的模板方法有void返回类型声明,然后您就陷入了困境,因为重写测试以在没有这些模板方法的情况下运行是一项艰巨的任务,甚至可能无法实现。然后这个小库就出现了,拯救了您的日子!

composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"

如何使用

首先,将测试更新为从\LegacyPHPUnit\TestCase扩展,而不是从\PHPUnit\Framework\TestCase扩展。

- class MyTest extends \PHPUnit\Framework\TestCase
+ class MyTest extends \LegacyPHPUnit\TestCase

然后,在您必须使用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()

参考

支持的版本

未来的版本可能会遵循相同的模式。

这个库不做什么

尽管这个库解决了问题的最大部分,但还有一些其他部分这个库没有设计去覆盖。例如

  • 某些版本的PHPUnit允许使用字符串与assertContains,而其他则不允许。
  • 在某些版本中,一个方法被调用为expectExceptionMessageRegExp,而在其他版本中,相同的方法被调用为expectExceptionMessageMatches
  • 等等。

有这些更改方法的polyfills(见下文),但对于您需要的这些方法,编写专门的polyfill应该不是什么大问题。例如

    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();
    }

如果存在多个模块化和非模块化的多版本polyfills以及其他方法