7

如何在 PHPUnit 中使用间谍对象?您可以在模仿上调用对象,然后您可以断言它调用了多少次。是间谍。

我知道 PHPUnit 中的“模拟”是存根对象和模拟对象。

4

3 回答 3

11

您可以断言在执行时使用 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 的文档以获取有关如何使用此替代测试双重框架创建、配置和使用存根、间谍和模拟的更多详细信息。

于 2011-02-07T16:44:18.943 回答
7

有一个从 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 代码搜索......

于 2015-05-06T04:10:45.207 回答
0

@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]);
于 2018-11-20T05:24:58.503 回答