在PHPUnit中使用Spy对象?

时间:2011-02-07 16:24:09

标签: php phpunit spy

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

我知道PHPUnit中的“Mock”是Stub Object和Mock Object。

3 个答案:

答案 0 :(得分: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将无法通过测试。有一些additional matchers besides exactly

此外,PHPUnit as has built-in support for using Prophecy创建自4.5版以来的测试双打。有关如何使用此备用测试双框架创建,配置和使用存根,间谍和模拟的更多详细信息,请参阅documentation for Prophecy

答案 1 :(得分:4)

有一个间谍从$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代码进行搜索......

答案 2 :(得分: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]);