【发布时间】:2015-09-22 01:07:52
【问题描述】:
我不熟悉使用 Mockery 并且对术语 alias 和 overload 感到困惑。谁能给我解释一下什么时候用哪个?
【问题讨论】:
我不熟悉使用 Mockery 并且对术语 alias 和 overload 感到困惑。谁能给我解释一下什么时候用哪个?
【问题讨论】:
我发现了这个: 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) 上设置。原始模拟从未被验证,因为它为新实例使用了期望存储。为此,我们使用术语“实例模拟”来将其与更简单的“别名模拟”区分开来。
所以在我看来,重载与别名的作用相同,不同之处在于它还从原始模拟导入期望。
【讨论】:
Overload 用于创建“实例模拟”。当创建一个类的新实例时,这将“拦截”并且将使用模拟。例如,如果要测试此代码:
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);
}
【讨论】: