Lzh on GitHub

不调用原始构造函数

当创建 生成的部分测试替身 时,Mockery 只会模拟我们明确告知要模拟的方法。这意味着我们正在模拟的类的原始构造函数将被调用。

当创建 生成的部分测试替身 时,Mockery 只会模拟我们明确告知要模拟的方法。这意味着我们正在模拟的类的原始构造函数将被调用。

在某些情况下,这不是我们期望的行为,因为构造函数可能会调用其他方法或与其他对象协作,因此在运行测试时可能会在应用程序环境中产生不期望的副作用。

如果发生这种情况,我们需要使用 运行时部分测试替身,因为它们不调用原始构造函数。

class MyClass
{
    public function __construct()
    {
        echo "Original constructor called." . PHP_EOL;
        // 其他副作用可能会发生...
    }
}
// 这将打印 "Original constructor called."
$mock = \Mockery::mock('MyClass[foo]');

一个更好的方法是使用运行时部分替身:

class MyClass
{
    public function __construct()
    {
        echo "Original constructor called." . PHP_EOL;
        // 其他副作用可能会发生...
    }
}
// 这将不会打印任何东西
$mock = \Mockery::mock('MyClass')->makePartial();
$mock->shouldReceive('foo');

这就是我们不推荐使用生成的部分测试替身的原因之一,如果可能,请始终使用运行时部分替身。

阅读更多关于 部分测试替身 的内容。

生成的部分测试替身的工作方式是一个向后不兼容的更改。如果您使用一个非常旧的 Mockery 版本,它的行为可能是在这些生成的局部模拟中不会调用构造函数。如果您升级到更新的 Mockery 版本,您可能必须更改测试以使用运行时部分替身,而不是生成的。此更改是在 2013 年初引入的,因此您使用比那更早的 Mockery 版本的可能性很低,所以这应该不是一个问题。