2011-04-26 28 views
15

Tôi muốn thử một phương thức trong cùng một lớp mà tôi đang thử nghiệm.Giả lập một phương thức trong cùng một lớp đang được thử nghiệm

ClassA { 
    function hardToTest($arg) { 
     // difficult to test code 
    } 

    function underTest() { 
     return $this->hardToTest('foo'); 
    } 
} 

Tôi đã nghĩ rằng tôi có thể sử dụng sự phản chiếu để làm điều này, nhưng có lẽ nó chỉ là một dấu hiệu cho thấy tôi nên di chuyển hardToTest vào một đối tượng khác.

+0

Tôi đang sử dụng PHPUnit 5,7, và tôi cần phải sử dụng 'createPartialMock' và xác định các phương pháp cần được chế giễu. – Ryan

+0

Tôi đồng ý rằng phải giả lập một phương thức trong cùng một lớp đang được thử nghiệm là mã ngửi, và phương pháp đó nên được chuyển sang một lớp khác. –

Trả lời

15

Thử nghiệm này sẽ thành công nếu underTest() vượt qua 'foo' đến hardToTest(). Điều này được gọi là một phần mô hình trong tài liệu của PHPUnit vì bạn chỉ đang mô phỏng một số phương pháp.

ClassATest { 
    function testUnderTest() { 
     $mock = $this->getMock('ClassA', ['hardToTest']); 
     $mock->expects($this->once()) 
      ->method('hardToTest') 
      ->with('foo'); 
     $mock->underTest(); 
    } 
} 

Tôi đồng ý với bản năng của bạn rằng nhu cầu này có thể là một mùi mã cho bạn biết rằng lớp học này đang làm quá nhiều.

PHPUnit 5.4+

Kể từ getMock() được tán thành trong 5.4, sử dụng getMockBuilder() thay vì:

$mock = $this->getMockBuilder('ClassA') 
      ->setMethods(['hardToTest']) 
      ->ge‌​tMock(); 
+2

thực sự nó phải là '$ mock = $ this-> getMock ('ClassA', ['hardToTest']);' tham số thứ hai của 'getMock' được mong đợi là một mảng các tên phương thức. –

+0

Trong một số trường hợp, bạn sẽ cần phải thực hiện một phần giả lập, ví dụ, nếu một trong các phương thức lớp tạo ra một yêu cầu HTTP. Nó sẽ là tốt để thử phương pháp đó và trả lại một cuống cho yêu cầu. – b01

+0

bây giờ mà getMock không còn được dùng nữa, chúng ta có thể làm như thế nào? – julestruong

1

Chính xác thì phương pháp nào khó kiểm tra?

Nếu phương pháp được bảo vệ, bạn chỉ có thể mở rộng ClassA của mình và thực hiện công khai hardToTest($arg).

Điểm mấu chốt ở đây là bạn không nên sửa đổi lớp học chỉ vì bạn cần phải viết unittest cho nó.

+1

Tôi cần kiểm tra một phương thức gọi một phương thức khác trong CÂU LẠC BỘ. Tôi muốn có thể giả lập chức năng cho phương thức đó khi chạy. Di chuyển phương thức vào một lớp khác không phải là lựa chọn ưa thích của tôi. – james

+1

kinda như thế này: http://codepad.viper-7.com/v3SA0s –

+0

có thats khá gần với ý tưởng .... tạo ra một phân lớp của hệ thống theo thử nghiệm và stub ra các phương pháp có liên quan tôi không muốn kiểm tra. cảm ơn sự giúp đỡ – james

0

Điều tôi đã sử dụng là tạo ra một lớp con của hệ thống của tôi đang được thử nghiệm với phương pháp liên quan được giải quyết.

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