Là gói mã bên thứ ba là giải pháp duy nhất để đơn vị kiểm tra người tiêu dùng của mình?


13

Tôi đang thực hiện kiểm thử đơn vị và trong một trong các lớp của mình, tôi cần gửi thư từ một trong các phương thức, vì vậy, bằng cách sử dụng hàm tạo, tôi tiêm một thể hiện của Zend_Maillớp trong khung Zend.

Bây giờ một số người lập luận rằng nếu một thư viện đủ ổn định và sẽ không thay đổi thường xuyên thì không cần phải bọc nó. Vì vậy, giả sử rằng Zend_Mailnó ổn định và sẽ không thay đổi và nó hoàn toàn phù hợp với nhu cầu của tôi, thì tôi sẽ không cần một trình bao bọc cho nó.

Bây giờ hãy xem lớp học của tôi Loggerphụ thuộc vào Zend_Mail:

class Logger{
    private $mailer;    
    function __construct(Zend_Mail $mail){
        $this->mail=$mail;
    }    
   function toBeTestedFunction(){
      //Some code
      $this->mail->setTo('some value');
      $this->mail->setSubject('some value');
      $this->mail->setBody('some value');
      $this->mail->send();
     //Some
   }        
}

Tuy nhiên, kiểm thử đơn vị yêu cầu tôi kiểm tra một thành phần tại một thời điểm, vì vậy tôi cần phải chế nhạo Zend_Maillớp. Ngoài ra, tôi đang vi phạm nguyên tắc Nghịch đảo phụ thuộcLoggerlớp của tôi bây giờ phụ thuộc vào sự không lắng đọng.

Bây giờ làm thế nào tôi có thể kiểm tra Loggertrong sự cô lập mà không gói Zend_Mail?!

Mã này là trong PHP, nhưng câu trả lời không phải là. Đây là một vấn đề thiết kế hơn là một tính năng cụ thể của ngôn ngữ


Bạn có phải sử dụng một giao diện? PHP không hỗ trợ gõ vịt?
kevin cline

@kevincline Tôi đã sử dụng PHP vì đó là ngôn ngữ mà tôi sử dụng nhiều nhất, nhưng thực ra tôi đang tìm một giải pháp chung cho vấn đề không chỉ giới hạn ở PHP.
Songo

Câu trả lời:


21

Bạn luôn muốn bọc các loại và phương thức của bên thứ ba đằng sau một giao diện. Điều này có thể tẻ nhạt và đau đớn. Đôi khi bạn có thể viết một trình tạo mã hoặc sử dụng một công cụ để làm điều này.

Nhưng đừng cố sử dụng các phương thức hoặc kiểu thư viện trong toàn bộ mã của bạn. Để bắt đầu, bạn sẽ gặp khó khăn khi viết bài kiểm tra đơn vị. Sau đó, giấy phép sẽ thay đổi hoặc bạn sẽ muốn đến một nền tảng không được bên thứ ba hỗ trợ và bạn sẽ thấy rằng các loại và phụ thuộc đó đã đan xen trong và xung quanh tất cả các lớp khác của bạn.

Khả năng thay đổi nhà cung cấp bên thứ ba một cách nhanh chóng là một lợi thế rất lớn.


4
"Bất cứ điều gì không được viết bởi bạn" là một chút nhiều. Các thư viện là một phần của tiêu chuẩn hoặc nền tảng rất khó để bọc. Bạn có thể sẽ không muốn bọc tất cả các thành phần .NET, ví dụ. Nếu các trình bao bọc chỉ chuyển qua các giao diện hoặc được tạo mã, tôi đã tìm thấy rất ít lợi ích để viết bài kiểm tra. Nếu có logic trong đó (kết hợp các cuộc gọi, v.v.) các bài kiểm tra có thể hữu ích.
Ben

3
Nâng cao cho câu cuối cùng.
Blrfl

1
Nếu bạn tái cấu trúc đúng cách, mọi hoạt động sử dụng lặp lại của các cơ sở thư viện sẽ được đưa vào một lớp dịch vụ. Không cần phải xác định nó lên phía trước.
kevin cline

3
-1: Trừ trường hợp thư viện bên thứ ba cung cấp dịch vụ có API được tiêu chuẩn hóa, đây là một sự lãng phí rất lớn thời gian và sẽ chỉ làm giảm khả năng bảo trì bằng cách bạn sao chép mã. Ngoài ra, YAGNI.
Michael Borgwardt

1
@MichaelBorgwardt: Chắc chắn, nhưng trong trường hợp đó, API tiêu chuẩn trở thành trình bao bọc và bạn có thể trao đổi thư viện dễ dàng.
Blrfl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.