2012-02-15 67 views
13

考慮以下方法: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()方法,所以這是行不通的。

回答

14

要測試是否引發了某些事情,您需要創建一個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(),因爲我不確定是否可以模擬全局函數,如示例中的函數。我可能是錯的。

+0

謝謝!這很好。我遺漏了'will()'調用,因爲回調並不需要做任何事情。 – FtDRbwLXw6 2012-02-15 16:40:01

6

你可以讓你的回調設置一個局部變量並聲明它已被設置。

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