如何确保模拟时真实对象中存在方法?

时间:2013-05-15 16:37:00

标签: phpunit mockery

如果我使用Mockery模拟接口并使用带有不存在方法的shouldReceive,我希望我的测试失败。环顾四周没有帮助。

例如:

使用界面:

interface AInterface {
    public function foo();
    public function bar();
}

一个测试用例:

function testWhatever{
    Mockery::mock('AInterface')->shouldReceive('bar');
    $this->assertTrue(true);
}

测试将通过。

现在,重构时间,在一个地方不需要bar方法(假设在几个地方需要它)并且从界面定义中被抑制,但测试仍然会通过。我希望它失败。

是否可以使用mockery做这样的事情(并且能够用类而不是接口做同样的事情)? 或者是否存在其他工具或测试方法的解决方法?

如果可以理解这一点,那么,如果需要的话,会尝试更清楚地描述问题。

2 个答案:

答案 0 :(得分:3)

要确保Mockery不允许您模拟不存在的方法,请将以下代码放在PHPUnit引导程序文件中(如果您希望所有测试的此行为):

\Mockery::getConfiguration()->allowMockingNonExistentMethods(false);

如果您只想针对特定测试用例执行此操作,请将代码放在该测试用例的setUp()方法中。

查看this section of the Mockery manual on Github了解详情。

答案 1 :(得分:-1)

如果您想确保只调用一次该方法,可以使用一次()

假设类AImplementation ,实现了接口 AInterface ,并且您想测试该方法是否被调用,例如:

  

嘲笑::模拟( 'AImplementation') - > shouldReceive( '巴') - >在();

您还可以使用: zeroOrMoreTimes()两次()次(n),结帐repo at github。另外,我建议你杰弗里W {/ 3> {/ 3}}