2011-02-07 30 views
6

Làm cách nào tôi có thể sử dụng đối tượng gián điệp trong PHPUnit? Bạn có thể gọi đối tượng bắt chước, và sau khi bạn có thể xác nhận số lần nó được gọi. Đó là Spy.Sử dụng đối tượng gián điệp trong PHPUnit?

Tôi biết "Mock" trong PHPUnit là đối tượng Stub và đối tượng giả.

+0

Điều gì * "Bạn có thể gọi đối tượng bắt chước trên" * nghĩa là gì? * "bao nhiêu lần nó được gọi là" * ... bạn có nghĩa là * "đã được gọi là" *? – netcoder

Trả lời

9

Bạn có thể khẳng định bao nhiêu lần một Mock được gọi với PHPUnit khi làm

$mock = $this->getMock('SomeClass'); 
    $mock->expects($this->exactly(5)) 
     ->method('someMethod') 
     ->with(
      $this->equalTo('foo'), // arg1 
      $this->equalTo('bar'), // arg2 
      $this->equalTo('baz') // arg3 
     ); 

Khi bạn sau đó gọi một cái gì đó trong TestSubject để gọi Mock, PHPUnit sẽ không kiểm tra khi SomeClass someMethod không được gọi là năm lần với các đối số foo, bar, baz. Có một số additional matchers besides exactly.

Ngoài ra, PHPUnit as has built-in support for using Prophecy để tạo thử nghiệm tăng gấp đôi kể từ phiên bản 4.5. Vui lòng tham khảo documentation for Prophecy để biết thêm chi tiết về cách tạo, định cấu hình và sử dụng khai thác, gián điệp và chế độ giả bằng cách sử dụng khung kiểm tra thay thế này.

4

Có một điệp viên trở về từ $this->any(), bạn có thể sử dụng nó một cái gì đó như:

$foo->expects($spy = $this->any())->method('bar'); 
$foo->bar('baz'); 

$invocations = $spy->getInvocations(); 

$this->assertEquals(1, count($invocations)); 
$args = $invocations[0]->arguments; 
$this->assertEquals(1, count($args)); 
$this->assertEquals('bar', $args[0]); 

tôi đặt lên một blog entry về vấn đề này tại một số sân khấu: http://blog.lyte.id.au/2014/03/01/spying-with-phpunit/

Tôi không có ý tưởng nơi (nếu?) nó được ghi lại, tôi tìm thấy nó tìm kiếm thông qua mã PHPUnit ...

+0

Chỉ là tôi hoặc [trường hợp này không còn là trường hợp] (https://github.com/sebastianbergmann/phpunit/blob/60c32c5b5e79c2248001efa2560f831da11cc2d7/src/Framework/TestCase.php#L1898-L1901)? –

+1

Đồng ý https://github.com/sebastianbergmann/phpunit/issues/2326 – lyte

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