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()
, поэтому это не работает.
Ответы
Ответ 1
Чтобы проверить, было ли что-то вызвано или нет, вам нужно создать mock test double и настроить его на ожидание того, что его будет называть N раз.
Здесь используется решение для использования обратного вызова объекта (untested):
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()
, потому что я не уверен, что вы можете имитировать глобальные функции, подобные тем, которые указаны в вашем примере. Возможно, я ошибаюсь.
Ответ 2
У вас может быть установлен обратный вызов локальной переменной и утверждать, что он был установлен.
public function testFoo() {
$called = false;
$this->obj->foo(function() use (&$called) {
$called = true;
});
self::assertTrue($called, 'Callback should be called');
}