考虑以下方法:
public function foo($callback) {
call_user_func($callback);
}
如何使用PHPUnit测试实际调用回调? foo()
方法没有返回值。它唯一的工作是执行一个给它的回调,以及其他一些查找和misc。我为了简单起见而遗漏的处理。
我试过这样的事情:
public method testFoo() {
$test = $this;
$this->obj->foo(function() use ($test) {
$test->pass();
});
$this->fail();
}
...但显然没有pass()
方法,所以这不起作用。
答案 0 :(得分:15)
要测试是否调用了某些内容,您需要创建一个mock test 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'));
}
如果永远不会调用$mock->myCallBack()
或多次调用,PHPUnit将自动失败测试。
我使用了stdClass
及其方法myCallBack()
,因为我不确定你是否可以像示例中那样模拟全局函数。我可能错了。
答案 1 :(得分:6)
您可以让回调设置为局部变量并声明它已设置。
public function testFoo() {
$called = false;
$this->obj->foo(function() use (&$called) {
$called = true;
});
self::assertTrue($called, 'Callback should be called');
}