2

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

例如 :

带接口:

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

和一个测试用例:

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

测试将通过。

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

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

不确定是否可以按原样理解,如果需要,将尝试对问题进行更清晰的描述。

4

2 回答 2

4

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

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

如果您只希望特定测试用例的这种行为,请将代码放入该setUp()测试用例的方法中。

查看Github 上 Mockery 手册的这一部分以获取更多信息。

于 2013-10-11T16:10:14.657 回答
-1

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

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

Mockery::mock('AImplementation')->shouldReceive('bar')->once();

您还可以使用:zeroOrMoreTimes()、 two( )times(n)在 github 上查看 repo。另外,我向您推荐Jeffrey W 的本教程

于 2013-06-03T23:16:14.473 回答