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

时间:2015-07-04 10:26:00

标签: php phpunit tdd mockery

我不熟悉使用Mockery并与术语aliasoverload混淆。任何人都可以向我解释何时使用哪个?

2 个答案:

答案 0 :(得分:17)

Overload用于创建“实例模拟”。当创建类的新实例并且将使用mock时,这将“拦截”。例如,如果要测试此代码:

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用于模拟公共静态方法。例如,如果要测试此代码:

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

答案 1 :(得分:-2)

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

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

使用“alias:”前缀类(当前未加载)的有效名称将生成“别名模拟”。别名模拟创建一个具有给定类名到stdClass的类别名,通常用于启用公共静态方法的模拟。在引用静态方法的新模拟对象上设置的期望将被此类的所有静态调用使用。

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

使用“overload:”前缀类(当前未加载)的有效名称将生成别名模拟(与“alias:”一样),除了创建该类的新实例将导入任何期望在原始模拟上设置($ mock)。原始模拟永远不会被验证,因为它使用了新实例的期望存储。为此,我们使用术语“实例模拟”将其与更简单的“别名模拟”区分开来。

所以对我而言,似乎重载与别名相同,不同之处在于它还从原始模拟中导入了期望值。