如何在PHPUnit中使用Spy对象? 您可以在模仿中调用对象,然后您可以断言它调用了多少次。 这是间谍。
我知道PHPUnit中的“Mock”是Stub Object和Mock Object。
答案 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]);