2013-02-12 30 views
5

Tôi có vấn đề với chế giễu phương pháp phụ huynh, đây là ví dụ:PHPUnit phương pháp mô hình mẹ

class PathProvider 
{ 
    public function getPath() 
    { 
     return isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/'; 
    } 
} 


class Uri extends PathProvider 
{ 
    public function getParam($param) 
    { 
     $path = $this->getPath(); 

     if ($path == $param) 
      return 'OK'; 
     else 
      return 'Bad'; 
    } 
} 

Và bây giờ tôi muốn phương pháp getPath giả(), và gọi phương thức getParam() mà recive chế giễu giá trị.

$mock = $this->getMock('PathProvider'); 

$mock->expects($this->any()) 
->method('getPath') 
->will($this->returnValue('/panel2.0/user/index/id/5')); 

Tôi đã viết phần này, nhưng tôi không biết làm cách nào tôi phải chuyển giá trị giả này vào phương pháp thử nghiệm.

+2

Tôi nghĩ thiết kế lại có thể theo thứ tự, Uri không phải là Nhà cung cấp dịch vụ hướng dẫn, nó chỉ cần dịch vụ của mình. – GordonM

+0

@GordonM hoàn toàn đúng! Bạn nên làm cho PathProvider như là một phụ thuộc và tiêm nó bên trong lớp Uri (thông qua bộ điều khiển hoặc settter). Đừng lạm dụng intheritance – Cyprian

Trả lời

5

Bạn chỉ cần chế nhạo Uri lớp học. Bạn có thể thử phương pháp duy nhất (getPath), như vậy:

$sut = $this->getMock('Appropriate\Namespace\Uri', array('getPath')); 

$sut->expects($this->any()) 
    ->method('getPath') 
    ->will($this->returnValue('/panel2.0/user/index/id/5')); 

Và sau đó bạn có thể kiểm tra đối tượng của bạn như bình thường:

$this->assertEquals($expectedParam, $sut->getParam('someParam')); 
+0

Khi tôi gọi phương thức như bạn nói tôi recive lỗi: 'Gọi đến undefined phương pháp Mock_Uri_b1cf6492 :: getParam()' –

+0

có lẽ bạn quên thêm không gian tên thích hợp để getMock phương pháp. Nhìn vào ví dụ của tôi ở trên (tôi sẽ chỉnh sửa câu trả lời) – Cyprian

+0

Trong ứng dụng của tôi, tôi có không gian tên chính xác, nhưng tôi luôn có lỗi như trên. –

4

Tôi và bạn bè của tôi viết Mockito như chế giễu thư viện. ouzo-goddies#mocking

$mock = Mock::create('\Appropriate\Namespace\Uri'); 
Mock::when($mock)->getPath()->thenReturn(result); 
Các vấn đề liên quan