2009-12-01 31 views
7

Tôi có một lớp tĩnh mà kết thúc tốt đẹp một số phương pháp có nguồn gốc từ winspool:Mocking một Class tĩnh

public static class WinSpool 
{ 
    [DllImport("winspool.drv")] 
    public static extern int OpenPrinter(string pPrinterName, out IntPtr phPrinter, IntPtr pDefault); 
    ... 
    //some more methods here 
} 

Tôi muốn nhạo báng họ cho kiểm tra đơn vị, nhưng không thể tìm thấy một mô hình cho việc này. (Mọi người có tránh các lớp tĩnh không?)

Trả lời

10

Có, lớp tĩnh thường là frowned upon in the field of unit testing and mocking. AFAIK không có khuôn khổ mocking nguồn mở (chẳng hạn như Rhino Mocks) hỗ trợ lớp tĩnh mocking

Nếu bạn hoàn toàn và tích cực phải giả lập lớp tĩnh, thì tôi sợ rằng bạn phải truy cập Typemock, không miễn phí.

+6

Tôi thấy thật mỉa mai khi các thành viên tĩnh được "cau mày", khi những gì chúng ta thực sự nên cau mày là các khuôn khổ giả mạo không thể giả lập thành viên tĩnh. Sau khi tất cả, nếu TypeMock có thể làm điều này, tại sao các khuôn khổ OSS không thể làm như vậy? –

+1

Lý do cho điều này là hầu hết các khuôn khổ mocking thực hiện mocks bằng cách sử dụng mẫu Proxy, về cơ bản đòi hỏi thừa kế, và tất nhiên các lớp tĩnh không thể được kế thừa từ đó. Typemock sử dụng một cách tiếp cận hoàn toàn khác, bằng cách chuyển hướng các cuộc gọi phương thức với phép tiêm IL, cho phép nó tạo ra các cuộc gọi tĩnh. – womp

+6

Bởi vì nó là * quá đắt để được phát triển miễn phí * (http://stackoverflow.com/questions/1534119/is-there-any-open-source-mocking-framework-resembling-typemock) – Graviton

2

Microsoft đã sản xuất một khung Fakes cho Visual Studio 2012 Ultimate cho phép các kiểu tĩnh được chế nhạo bằng cách sử dụng miếng chêm. Shims là "giả" hội đồng cung cấp đại biểu cho tất cả các phương pháp truy cập bên ngoài. Các cuộc gọi sau đó được định tuyến thông qua bộ lọc sự kiện và bất cứ nơi nào thử nghiệm đã thiết lập một trong các đại biểu của nó, đại biểu sẽ xử lý cuộc gọi. Không phải ai muốn khuyến khích các loại tĩnh không được xử lý thông qua việc tiêm phụ thuộc. Hướng được ưu tiên là di chuyển đi vì nhu cầu về miếng chêm và hướng tới việc sử dụng cuống bằng DI.