Phpunit 当模拟时,如何确保方法存在于真实对象中?
如果我使用mockry模拟接口,并使用shouldReceive和不存在的方法,我希望我的测试失败。环顾四周也无济于事 例如: 具有一个接口:Phpunit 当模拟时,如何确保方法存在于真实对象中?,phpunit,mockery,Phpunit,Mockery,如果我使用mockry模拟接口,并使用shouldReceive和不存在的方法,我希望我的测试失败。环顾四周也无济于事 例如: 具有一个接口: interface AInterface { public function foo(); public function bar(); } 和一个测试用例: function testWhatever{ Mockery::mock('AInterface')->shouldReceive('bar'); $thi
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文档已经移动,所以我更新了相关页面答案中的链接。。。不过,这似乎并不是专门针对类和接口的。我们与同事进行了一些测试,得出结论,这只适用于类。我不知道我是否必须把你的答案标记为正确答案,因为我说的是接口而不是类,但这对我帮助很大。谢谢:)