2012-02-15 33 views
13

Với phương pháp sau đây:PHPUnit - Cách kiểm tra xem cuộc gọi lại có được gọi không?

public function foo($callback) { 
    call_user_func($callback); 
} 

Làm thế nào tôi sẽ kiểm tra xem callback thực sự đã gọi, sử dụng PHPUnit? Phương thức foo() không có giá trị trả lại. Công việc duy nhất của nó là thực hiện một cuộc gọi lại cho nó, với một số tra cứu khác và misc. chế biến mà tôi đã bỏ ra vì mục đích đơn giản.

tôi đã cố gắng một cái gì đó như thế này:

public method testFoo() { 
    $test = $this; 
    $this->obj->foo(function() use ($test) { 
     $test->pass(); 
    }); 
    $this->fail(); 
} 

... nhưng dường như không có phương pháp pass(), vì vậy đây không hoạt động.

Trả lời

14

Để kiểm tra xem có điều gì đó được gọi hay không, bạn cần tạo một số mock test double và định cấu hình để mong đợi được gọi là số lần N.

Dưới đây là một giải pháp cho việc sử dụng một callback đối tượng (chưa được kiểm tra):

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 sẽ tự động không kiểm tra nếu $mock->myCallBack() không bao giờ được gọi, hoặc gọi nhiều hơn một lần.

Tôi đã sử dụng stdClass và phương pháp myCallBack() vì tôi không chắc liệu bạn có thể giả lập các chức năng toàn cục như chức năng trong ví dụ của bạn hay không. Tôi có thể sai về điều đó.

+0

Cảm ơn! Điều này làm việc tuyệt vời. Tôi đã bỏ qua cuộc gọi 'will()', vì cuộc gọi lại không thực sự cần phải làm gì cả. – FtDRbwLXw6

6

Bạn có thể đặt lại hàm gọi lại biến cục bộ và xác nhận rằng nó đã được đặt.

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

Rất đơn giản và hiệu quả. Cảm ơn bạn! – marcellorvalle

Các vấn đề liên quan