sitphp/doubles

一个简单而强大的库,用于为测试创建类 doubles

v2.4.5 2022-11-19 04:18 UTC

README

Build Status

"sitphp/doubles" 库可以帮助您通过生成看起来像原始类但可以进行操作和测试的 doubles 来测试您的 PHP 类(有点像类的副本)。然后可以使用这些 doubles 代替原始类进行测试。此库可以创建任何类型的类、接口或 traits 的 doubles。

查看完整文档: 这里

要求

"sitphp/doubles" 库需要至少 PhpUnit 6.5 和至少 PHP 7.0。它应该通过 composer 安装,这将确保您的配置符合要求。

{.note .info} 注意:您可以从这里获取 composer: https://getcomposer.org.cn

安装

将以下行添加到 composer.json 文件中的 "require-dev" 部分:"sitphp/doubles": "2.4.*"

{
    "require-dev": {
        "sitphp/doubles": "2.4.*"
    }
}

然后运行以下命令:

composer update

这将安装 "sitphp/doubles" 库的最新版本以及所需的 PhpUnit 包。

创建一个 double

当原始类的所有方法都被覆盖以返回 null 时,double 被称为 "dummy"。要获取 "dummy" double 实例,请使用 dummy 方法。

// Get a double instance of type "dummy" for class "MyClass"
$my_double = Double::dummy(MyClass::class)->getInstance();

当原始类的所有方法都被覆盖以与原始类中的行为相同时,double 被称为 "mock"。要获取 "mock" double 实例,请使用 mock 方法。

// Get a double instance of type "mock" for class "MyClass"
$my_double = Double::mock(MyClass::class)->getInstance();

更多详情: 阅读创建 doubles 的文档

测试一个 double

要测试 double 方法被调用的次数,请使用 count 方法。

// Test that the method "myMethod" is called a least one time
$double::_method('myMethod')->count('>=1');

要测试传递给 double 方法的参数值,请使用 args 方法。

// Test that the arguments passed to method "myMethod" are "value1" and "value2"
$double::_method('myMethod')->args(['value1', 'value2']);

要更改方法的返回值,请使用 stub 方法。

// Make method "myMethod" return "hello"
$my_double::_method('myMethod')->return('hello');

更多详情: 阅读测试 doubles 的文档

配置

您可以使用 dummymock 方法的第二个参数来定义特定 double 的配置。

// Get double instance with config
$my_double = Double::dummy(MyClass::class, [
    'allow_final_doubles' => true,
    'allow_non_existent_classes' => true
])->getInstance();

以下是所有可用的配置参数列表:

  • allow_final_doubles:将此参数设置为 false 以阻止尝试创建最终类/方法的 doubles。
  • allow_protected_methods:将此参数设置为 false 以禁止测试受保护的方法。
  • allow_non_existent_classes:将此参数设置为 false 以禁止非存在类的别名 doubles。
  • test_unexpected_methods:将此参数设置为 true 以在调用意外方法时自动接收断言错误。

更多详情: 阅读配置文档

关于

许可证

此库根据 MIT 许可证 许可。

作者

Alexandre Geiswiller - alexandre.geiswiller@gmail.com