2012-04-02 19 views
5

Có lẽ tôi cho thấy sự thiếu hiểu biết về tiêm phụ thuộc và thử nghiệm của mình, nhưng tôi không hiểu cách sử dụng tiêm phụ thuộc với các lớp không triển khai giao diện sẽ giúp tôi gì cả khi thử nghiệm?Mã kiểm tra phụ thuộc vào Thư viện doanh nghiệp mặc dù nó không cung cấp giao diện?

Ví dụ: trong tài liệu Thư viện doanh nghiệp 5.0, nó thảo luận về việc sử dụng vùng chứa Unity để tạo các phiên bản. Nó nói rằng điều này viện trợ "testability: Nó là tầm thường để cô lập các lớp học từ phụ thuộc khi sử dụng phong cách tiêm phụ thuộc." MSDN

Làm cách nào để sử dụng điều này trong các thiết bị thử nghiệm đơn vị của tôi? Ví dụ của họ có một hàm tạo với tham số là các lớp thay vì giao diện:

public class TaxCalculator 
{ 
    private ExceptionManager _exceptionManager; 
    private LogWriter _logWriter; 

    public TaxCalculator(ExceptionManager em, LogWriter lw) 
    { 
    this._exceptionManager = em; 
    this._logWriter = lw; 
    } 
} 

Trả lời

9

Để trả lời câu hỏi "Tôi làm cách nào để kiểm tra mã Thư viện doanh nghiệp": bạn không. Thử nghiệm công cụ của người khác là công việc của người khác. Bất kỳ giao diện hoặc trừu tượng nào trong Thư viện doanh nghiệp hoặc bất kỳ thư viện bên thứ ba nào khác tồn tại cho mục đích trừu tượng của riêng chúng, không phải cho mục đích của bạn. Những gì bạn cần làm là xác định giao diện của bạn mô tả nhu cầu của ứng dụng của bạn (ghi nhật ký, lưu bộ nhớ đệm, mã hóa, v.v.) và sau đó viết bộ điều hợp thực hiện giao diện của bạn bằng Thư viện Doanh nghiệp (hoặc thư viện bên thứ ba khác) . Thực hành này được gọi là Dependency Inversion Principle.

Để kiểm tra mã của riêng bạn được thiết kế theo cách này, đối với các bài kiểm tra cấp độ đơn vị/thành phần, bạn sẽ chỉ sử dụng Kiểm tra đôi cho các giao diện bạn đã tự xác định (ví dụ: IMyOwnLogger). Để kiểm tra các bộ điều hợp mà bạn viết để thích ứng với các thư viện của bên thứ ba, bạn sẽ viết các bài kiểm tra tích hợp. Để kiểm tra xem tất cả hoạt động cùng nhau, bạn sẽ viết các bài kiểm tra chấp nhận để thúc đẩy ứng dụng thông qua giao diện người dùng hoặc dưới da.

Để biết thêm thông tin về chế độ xem này, hãy xem bài viết của tôi: "TDD Best Practices: Don't Mock Others".

+0

Tôi đã thay đổi tiêu đề để phản ánh thực tế rằng tôi không muốn kiểm tra Thư viện doanh nghiệp nhưng mã của riêng tôi phụ thuộc vào Thư viện doanh nghiệp. –

+0

Tôi đã cập nhật câu trả lời để nói rõ ràng cách bạn sẽ kiểm tra mã của riêng mình theo ánh sáng của các phụ thuộc bên ngoài. –

+0

Btw xác định giao diện riêng mô tả nhu cầu của ứng dụng của bạn (ví dụ: ghi nhật ký) có vẻ tốt. Việc tách cơ sở hạ tầng khỏi mã kinh doanh là rất tốt. Nhưng mất tính năng khuôn khổ mát mẻ, thêm một mức độ trừu tượng khác, mất tối ưu hóa và hiệu suất, chắc chắn là không tốt. –

4

Tốt hơn là nên lập trình chống trừu tượng thay vì triển khai. Nhưng trừu tượng không phải lúc nào cũng là giao diện. Nó có thể là lớp trừu tượng.

public abstract class LogWriter 
{ 
    public abstract void Write(string message); 
} 

Vì vậy, không có vấn đề để tạo ra mô hình của lớp trừu tượng:

Mock<LogWriter> logWriter = new Mock<LogWriter>(); 
TaxCalculator calc = new TaxCalculator(logWriter.Object); 

Nếu bạn không làm đơn vị thử nghiệm, tôi không thấy bất kỳ vấn đề để vượt qua các thông số không trừu tượng, bởi vì của nguyên tắc YAGNI. Nếu tôi không cần thực hiện ExceptionManager khác, thì tại sao tôi nên tạo trừu tượng hóa nó? Nhưng nếu tôi làm TDD, thì chắc chắn tôi sẽ cần ít nhất hai lần triển khai lớp học. Một thực tế và một mô hình/sơ khai.

Btw phải cẩn thận với service locator anti-pattern.

CẬP NHẬT: Không nhận được rằng bạn đang đề cập đến các lớp học hiện tại của Microsoft.Practices.EnterpriseLibrary (mà tôi không thích). Tôi nghĩ đó là một thất bại thiết kế khác của nhóm Microsoft.Practices. Tạo lớp ExceptionManager 'kín' không thực hiện bất kỳ lớp giao diện/lớp cơ sở nào làm chết tính kiểm thử.

+0

Tóm tắt trong thư viện của bên thứ ba có mục đích riêng, không cung cấp cho bạn một trừu tượng để sử dụng. Ngoài ra, Thư viện doanh nghiệp có lẽ là kịch bản hoàn hảo cho việc sử dụng từ khóa kín. P & P đã luôn luôn nói rằng họ không có ý định EL được sử dụng trực tiếp, nhưng là một ví dụ cho việc viết mã. Họ không muốn mọi người mở rộng nội dung của họ và sau đó phàn nàn khi họ thực hiện thay đổi thiết kế trong các phiên bản sau. –

+0

Vì vậy, bạn nghĩ ví dụ: ILog trong log4net không phải là để cung cấp cho tôi một trừu tượng để sử dụng? –

+0

Lấy tuyên bố đó là cường điệu nếu bạn muốn. Các nhà cung cấp phần mềm khác nhau bao gồm các giao diện vì các lý do khác nhau. Đôi khi các giao diện hiện diện như một sản phẩm phụ của phương pháp thử nghiệm của nhà cung cấp. Lần khác có thể có nhiều triển khai mà thành phần cấp cao hơn dựa vào. Một số nhà cung cấp có thể cung cấp giao diện dưới dạng đường nối với hy vọng cho phép thay đổi thiết kế trong tương lai thay đổi mà không sửa đổi giao diện công khai. Và có, một số có thể cung cấp giao diện nghĩ rằng nó sẽ là một trừu tượng để cai trị tất cả. Bất kể, bạn không nên dựa vào chúng trong thiết kế của riêng bạn. –

3

Miễn là lớp học của bạn không phải là sealed, khuôn khổ mocking có thể có thể tạo một lớp con hoạt động chính xác như triển khai giao diện giả lập. Có nhiều cân nhắc khi bạn phụ thuộc vào các lớp cụ thể - sealed các phương thức sẽ vẫn thực thi trên lớp được chỉ định, v.v. - nhưng nói chung là không khác gì tùy thuộc vào giao diện.

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