PHPUnit - 如何测试回调被调用?
问题描述:
考虑以下方法:PHPUnit - 如何测试回调被调用?
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()
方法,所以这是行不通的。
答
要测试是否引发了某些事情,您需要创建一个mock test double并将其配置为期望被调用N次。
下面是使用对象的回调(未测试)的溶液中:如果$mock->myCallBack()
永远不会调用,或多次调用
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的将自动使测试失败。
我使用了stdClass
及其方法myCallBack()
,因为我不确定是否可以模拟全局函数,如示例中的函数。我可能是错的。
答
你可以让你的回调设置一个局部变量并声明它已被设置。
public function testFoo() {
$called = false;
$this->obj->foo(function() use (&$called) {
$called = true;
});
self::assertTrue($called, 'Callback should be called');
}
+0
非常简单而有效。谢谢! – marcellorvalle 2015-12-17 16:54:54
谢谢!这很好。我遗漏了'will()'调用,因为回调并不需要做任何事情。 – FtDRbwLXw6 2012-02-15 16:40:01