Mockery 中的重载和别名有什么区别?

What is the difference between overload and alias in Mockery?

我是 Mockery 的新手,对术语 aliasoverload 感到困惑。谁能给我解释一下什么时候用哪个?

我发现了这个: https://github.com/padraic/mockery-docs/blob/master/reference/startup_methods.rst

$mock = \Mockery::mock('alias:MyNamespace\MyClass');

在 class(当前未加载)的有效名称前加上 "alias:" 将生成 "alias mock"。 Alias mocks 使用给定的 classname 为 stdClass 创建一个 class 别名,通常用于启用 public 静态方法的模拟。对引用静态方法的新模拟对象设置的期望将被对此 class.

的所有静态调用使用
$mock = \Mockery::mock('overload:MyNamespace\MyClass');

在 class(当前未加载)的有效名称前加上 "overload:" 将生成别名模拟(与 "alias:" 一样),除了创建的 class 的新实例将导入在原始模拟 ($mock) 上设置的任何期望。原始模拟从未经过验证,因为它使用了新实例的期望存储。为此,我们使用术语 "instance mock" 来区别于更简单的 "alias mock".

所以对我来说,重载似乎与别名的作用相同,不同之处在于它还从原始模拟中导入期望。

Overload用于创建一个"instance mock"。当创建 class 的新实例时,这将 "intercept" 并将使用模拟。例如,如果要测试此代码:

class ClassToTest {

    public function methodToTest()
    {
        $myClass = new MyClass();
        $result = $myClass->someMethod();
        return $result;
    }
}

您将使用 overload 创建一个模拟实例,并像这样定义期望:

 public function testMethodToTest()
 {
     $mock = Mockery::mock('overload:MyClass');
     $mock->shouldreceive('someMethod')->andReturn('someResult');

     $classToTest = new ClassToTest();
     $result = $classToTest->methodToTest();

     $this->assertEquals('someResult', $result);
 }

Alias 用于模拟 public 静态方法。例如,如果要测试此代码:

class ClassToTest {

    public function methodToTest()
    {
        return MyClass::someStaticMethod();
    }
}

您将使用 alias 创建别名模拟并定义如下期望:

public function testNewMethodToTest()
{
    $mock = Mockery::mock('alias:MyClass');
    $mock->shouldreceive('someStaticMethod')->andReturn('someResult');

    $classToTest = new ClassToTest();
    $result = $classToTest->methodToTest();

    $this->assertEquals('someResult', $result);
}