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

Phpunit 当模拟时,如何确保方法存在于真实对象中?,phpunit,mockery,Phpunit,Mockery,如果我使用mockry模拟接口,并使用shouldReceive和不存在的方法,我希望我的测试失败。环顾四周也无济于事 例如: 具有一个接口: interface AInterface { public function foo(); public function bar(); } 和一个测试用例: function testWhatever{ Mockery::mock('AInterface')->shouldReceive('bar'); $thi

如果我使用mockry模拟接口,并使用shouldReceive和不存在的方法,我希望我的测试失败。环顾四周也无济于事

例如:

具有一个接口:

interface AInterface {
    public function foo();
    public function bar();
}
和一个测试用例:

function testWhatever{
    Mockery::mock('AInterface')->shouldReceive('bar');
    $this->assertTrue(true);
}
考试会通过的

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

有没有可能用mockry做这样的事情(并且能够用类而不是接口做同样的事情)? 或者是否存在其他工具或测试方法的变通方法


如果可以按原样理解,Not sur将在需要时尝试对问题进行更清楚的描述。

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

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

mockry::mock('AImplementation')->shouldReceive('bar')->once()


您还可以使用:zeroOrMoreTimes()两次()次(n),签出。另外,我推荐Jeffrey W为确保mockry不允许您模拟不存在的方法,请将以下代码放入PHPUnit引导文件中(如果您希望所有测试都使用此行为):

\mockry::getConfiguration()->AllowMockingNoneExistentMethods(false);
如果您只希望特定测试用例具有这种行为,请将代码放入该测试用例的
setUp()
方法中


查看更多信息。

我知道mockry中的计数方法,但这不能确保AImplementation中存在bar方法。就像我在问题中说的,我不确定它是否被清楚地表达了,也许我应该做一个问题重构:)无论如何,谢谢你,还有你!once()确保调用了该方法,这样bar方法就存在于您的生产代码中在我的生产代码中是的,但不存在于AImplementation中,只存在于模拟对象中。嘿,谢谢您的回答。稍后将尝试并标记为有效:)嗨@Eugene M.完全忘记了这个问题。今天进行了一些测试,您的解决方案似乎适用于类模拟,但不适用于接口模拟。我是错过了什么,还是根本不可能?(如果需要,我可以和你分享我的测试代码;)@sellahcd老实说,我不确定。。。我看到Mockry文档已经移动,所以我更新了相关页面答案中的链接。。。不过,这似乎并不是专门针对类和接口的。我们与同事进行了一些测试,得出结论,这只适用于类。我不知道我是否必须把你的答案标记为正确答案,因为我说的是接口而不是类,但这对我帮助很大。谢谢:)