Подтвердить что ты не робот

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(), поэтому это не работает.

4b9b3361

Ответ 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');
}