webmozarts/strict-phpunit

在PHPUnit中启用对象的类型安全比较


README

在PHPUnit中启用对象的类型安全比较。

问题

PHPUnit有一个非常强大的比较系统,可以帮助你比较对象与预期值。

class ValueObject
{
    public ?string $property;
    
    public function __construct(?string $property)
    {
        $this->property = $property;
    }
}

$actual = new ValueObject('foo!');

self::assertEquals(new ValueObject('foo'), $actual);
// => fails with a very helpful error message

这个比较系统会给你一个有意义的异常,引导你精确地找到导致断言失败的错误。字符串还会进行差异比较,以便你看到哪个字符导致字符串不匹配。

PHPUnit会将对象的每个标量属性与宽松的类型进行比较。它在底层使用==时稍微聪明一些,但仍然不能总是提供你想要的结果

var_dump('Hi' == true);
// => true

self::assertEquals(new ValueObject('Hi'), new ValueObject(true));
// => fails

var_dump('' == null);
// => true

self::assertEquals(new ValueObject(''), new ValueObject(null));
// => succeeds

解决方案

此扩展为标量值启用了一个比较器,以解决此问题。使用此扩展,每当PHPUnit在assertEquals()(甚至在对象或数组中递归地)期间找到标量值时,它都会使用===进行比较。

对象仍然不检查身份,因此你仍然可以构造示例对象进行比较。

错误消息仍然有意义。

self::assertEquals(new ValueObject(''), new ValueObject(null));
// => fails with a meaningful error

self::assertEquals(new ValueObject('foo!'), new ValueObject('foo'));
// => fails with a meaningful error

self::assertEquals(new ValueObject('foo!'), new ValueObject('foo!'));
// => succeeds

安装

可以使用Composer安装此扩展

$ composer require --dev webmozarts/strict-phpunit

将扩展添加到您的phpunit.xml.dist文件中以启用它

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd">
    <!-- ... -->
    
    <extensions>
        <extension class="Webmozarts\StrictPHPUnit\StrictPHPUnitExtension"/>
    </extensions>
    
    <!-- ... -->
</phpunit>

作者

贡献

欢迎为该包做出贡献!

请注意,此仓库是单体仓库的子树分割,因此为只读。PR将移植到(内部)单体仓库。

许可

本包所有内容均使用MIT许可授权。