Используя шпионский объект в PHPUnit? - PullRequest
6 голосов
/ 07 февраля 2011

Как я могу использовать Spy Object в PHPUnit?Вы можете вызывать объект в режиме имитации, и после этого можете утверждать, сколько раз он вызывался.Это Spy.

Я знаю, что "Mock" в PHPUnit как объект-заглушка и объект-заглушка.

Ответы [ 3 ]

11 голосов
/ 07 февраля 2011

Вы можете утверждать, сколько раз Mock вызывался с PHPUnit при выполнении

    $mock = $this->getMock('SomeClass');
    $mock->expects($this->exactly(5))
         ->method('someMethod')
         ->with(
             $this->equalTo('foo'), // arg1
             $this->equalTo('bar'), // arg2
             $this->equalTo('baz')  // arg3
         );

Когда вы затем вызываете что-то в TestSubject, которое вызывает Mock, PHPUnit не пройдет тест, когда SomeClass someMethod не был вызванпять раз с аргументами фу, бар, баз.Помимо exactly.

существует ряд дополнительных сопоставителей. Кроме того, PHPUnit as имеет встроенную поддержку использования Prophecy для создания двойников теста, начиная с версии 4.5.,Пожалуйста, обратитесь к документации для Prophecy для получения дополнительной информации о том, как создавать, настраивать и использовать заглушки, шпионы и издевательства с использованием этого альтернативного тестового двойного фреймворка.

4 голосов
/ 06 мая 2015

Шпион вернулся с $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 ...

0 голосов
/ 20 ноября 2018

Обновление ответов @ 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]);
...