如何在 PHPUnit 中使用间谍对象?您可以在模仿上调用对象,然后您可以断言它调用了多少次。是间谍。
我知道 PHPUnit 中的“模拟”是存根对象和模拟对象。
您可以断言在执行时使用 PHPUnit 调用了多少次 Mock
$mock = $this->getMock('SomeClass');
$mock->expects($this->exactly(5))
->method('someMethod')
->with(
$this->equalTo('foo'), // arg1
$this->equalTo('bar'), // arg2
$this->equalTo('baz') // arg3
);
然后,当您在调用 Mock 的 TestSubject 中调用某些内容时,如果 SomeClass someMethod 未使用参数 foo、bar、baz 调用五次,PHPUnit 将无法通过测试。除了 之外,还有许多额外的匹配器exactly
。
此外,PHPUnit as 从 4.5 版开始就内置了对使用 Prophecy创建测试替身的支持。请参阅Prophecy 的文档以获取有关如何使用此替代测试双重框架创建、配置和使用存根、间谍和模拟的更多详细信息。
有一个从 spy 返回的间谍$this->any()
,你可以像这样使用它:
$foo->expects($spy = $this->any())->method('bar');
$foo->bar('baz');
$invocations = $spy->getInvocations();
$this->assertEquals(1, count($invocations));
$args = $invocations[0]->arguments;
$this->assertEquals(1, count($args));
$this->assertEquals('bar', $args[0]);
我在某个阶段发表了一篇关于此的博客文章:http: //blog.lyte.id.au/2014/03/01/spying-with-phpunit/
我不知道它记录在哪里(如果?),我发现它通过 PHPUnit 代码搜索......
@lyte 在 2018 年有效的答案更新:
$foo->expects($spy = $this->any())->method('bar');
$foo->bar('baz');
$invocations = $spy->getInvocations();
$this->assertEquals(1, count($invocations));
$args = $invocations[0]->getParameters();
$this->assertEquals(1, count($args));
$this->assertEquals('bar', $args[0]);