【问题标题】:PHPUnit - How to test if callback gets called?PHPUnit - 如何测试回调是否被调用?
【发布时间】:2012-03-06 23:31:46
【问题描述】:

给定以下方法:

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() 方法,所以这不起作用。

【问题讨论】:

    标签: php callback phpunit


    【解决方案1】:

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

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

    【讨论】:

    • 非常简单有效。谢谢!
    【解决方案2】:

    要测试是否调用了某些内容,您需要创建一个 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(),因为我不确定您是否可以像示例中的那样模拟全局函数。我可能是错的。

    【讨论】:

    • 谢谢!这很好用。我省略了will() 调用,因为回调实际上不需要做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多