簡體   English   中英

PHPUnit - 如何測試是否調用回調?

[英]PHPUnit - How to test if callback gets called?

給出以下方法:

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

要測試是否調用了某些內容,您需要創建一個模擬測試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()因為我不確定你是否可以像你的例子那樣模擬全局函數。 我可能錯了。

您可以讓回調設置為局部變量並斷言它已設置。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM