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

2022-08-31 01:04:02

给定以下方法:

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

要测试是否调用了某些内容,您需要创建一个模拟测试替身,并将其配置为期望被调用 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 从未被调用或多次调用,则 PHPUnit 将自动使测试失败。$mock->myCallBack()

我使用了及其方法,因为我不确定您是否可以模拟像示例中的全局函数一样。我可能错了。stdClassmyCallBack()


答案 2

您可以让回调设置一个局部变量,并断言它已设置。

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

推荐