PHPUnit - Как проверить, вызывается ли обратный вызов? - PullRequest
15 голосов
/ 15 февраля 2012

Учитывая следующий метод:

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

Ответы [ 2 ]

15 голосов
/ 15 февраля 2012

Чтобы проверить, было ли что-то вызвано или нет, вам нужно создать фиктивный двойной тест и настроить его так, чтобы он вызывался 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(), потому что я не уверен, что вы можете имитировать глобальные функции, подобные той, что в вашем примере. Я могу ошибаться по этому поводу.

6 голосов
/ 15 февраля 2012

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

public function testFoo() {
    $called = false;
    $this->obj->foo(function() use (&$called) {
        $called = true;
    });
    self::assertTrue($called, 'Callback should be called');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...