2012-02-15 5 views
13

Учитывая следующий метод:PHPUnit - Как проверить, вызвана ли обратная связь?

public function foo($callback) { 
    call_user_func($callback); 
} 

Как я могу проверить, что обратный вызов на самом деле получил колл, используя PHPUnit? Метод foo() не имеет возвращаемого значения. Его единственная задача - выполнить обратный вызов, предоставленный ему, с некоторыми другими поисками и разным. которую я забыл для простоты.

Я пытался что-то вроде этого:

public method testFoo() { 
    $test = $this; 
    $this->obj->foo(function() use ($test) { 
     $test->pass(); 
    }); 
    $this->fail(); 
} 

... но, видимо, нет pass() метода, так что это не работает.

ответ

14

Чтобы проверить, было ли что-то вызвано или нет, вам необходимо создать mock test double и настроить его на ожидание того, что его назовут N раз.

Вот решение для использования объект обратного вызова (непроверенные):

public method testFoo() { 
    $test = $this; 

    $mock = $this->getMock('stdClass', array('myCallBack')); 
    $mock->expects($this->once()) 
    ->method('myCallBack') 
    ->will($this->returnValue(true)); 

    $this->obj->foo(array($mock, 'myCallBack')); 
} 

PHPUnit автоматически проваливают тест, если $mock->myCallBack() никогда не вызывается, или вызывается более чем один раз.

Я использовал stdClass и его метод myCallBack(), потому что я не уверен, что вы можете имитировать глобальные функции, подобные тем, которые указаны в вашем примере. Возможно, я ошибаюсь.

+0

Thanks! Это отлично работает. Я отказался от вызова 'will()', так как обратный вызов фактически ничего не должен делать. – FtDRbwLXw6

6

У вас может быть установлен обратный вызов локальной переменной и утверждать, что он был установлен.

public function testFoo() { 
    $called = false; 
    $this->obj->foo(function() use (&$called) { 
     $called = true; 
    }); 
    self::assertTrue($called, 'Callback should be called'); 
} 
+0

Очень просто и эффективно. Спасибо! – marcellorvalle

Смежные вопросы