PHPUnit - 如何测试是否调用回调?

FtD*_*Xw6 15 php phpunit callback

给出以下方法:

public function foo($callback) {
    call_user_func($callback);
}
Run Code Online (Sandbox Code Playgroud)

我如何使用PHPUnit测试实际调用的回调?该foo()方法没有返回值.它唯一的工作是执行一个给它的回调,以及其他一些查找和misc.我为了简单起见而遗漏的处理.

我试过这样的事情:

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

......但显然没有pass()方法,所以这不起作用.

Mik*_*e B 15

要测试是否调用了某些内容,您需要创建一个模拟测试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'));
}
Run Code Online (Sandbox Code Playgroud)

如果$mock->myCallBack()从未调用过,或者多次调用,PHPUnit将自动失败.

我用stdClass它和它的方法,myCallBack()因为我不确定你是否可以像你的例子中那样模拟全局函数.我可能错了.


Dav*_*ess 6

您可以让回调设置为局部变量并断言它已设置.

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