2010-09-10 31 views
9

Vì vậy, tôi có một lớp trông như thế này:Kiểm tra một lớp với một sự phụ thuộc Class tĩnh/phương pháp

public class MyClassToTest() 
{ 
    MyStaticClass.DoSomethingThatIsBadForUnitTesting(); 
} 

và một lớp tĩnh trông như thế này:

public static class MyStaticClass() 
{ 
    public static void DoSomethingThatIsBadForUnitTesting() 
    { 
     // Hit a database 
     // call services 
     // write to a file 
     // Other things bad for unit testing 
    } 
} 

(Rõ ràng đây là một ví dụ bị bỏ qua)

Vì vậy, tôi biết rằng lớp thứ hai là doomed khi nói đến thử nghiệm đơn vị, nhưng có cách nào để tách lớp MyClassToTest để tôi có thể kiểm tra nó (KHÔNG CÓ ngay lập tức iating MyStaticClass). Về cơ bản, tôi muốn nó bỏ qua cuộc gọi này.

Lưu ý:. Đáng buồn là đây là một dự án Compact Framework, vì vậy các công cụ như Nốt ruồi và Typemock Isolator không thể sử dụng :(

+0

ngôn ngữ nào? Tôi có thể nghĩ ra một vài điều trong Python nhưng điều này trông giống như Java. – wheaties

+0

@wheaties - xin lỗi tôi nên nói ... C# (Visual Studio 2008) – Vaccano

Trả lời

12

Xác định một giao diện mà làm điều tương tự như DoSomethingThatIsBadForUnitTesting, ví dụ:

public interface IAction { 
    public void DoSomething(); 
} 

(. Rõ ràng, trong mã thực, bạn sẽ chọn tên tốt hơn)

Sau đó, bạn có thể viết một wrapper đơn giản cho lớp để sử dụng trong mã sản xuất:

public class Action : IAction { 
    public void DoSomething() { 
     MyStaticClass.DoSomethingThatIsBadForUnitTesting(); 
    } 
} 

Trong MyClassToTest, bạn chuyển trường hợp IAction qua hàm tạo của nó và gọi phương thức trên cá thể đó thay vì lớp tĩnh. Trong mã sản xuất, bạn chuyển vào lớp bê tông Action để mã hoạt động như trước. Trong bài kiểm tra đơn vị, bạn vượt qua trong một đối tượng giả lập thực hiện IAction, hoặc bằng cách sử dụng một khuôn mẫu giả hoặc lăn mô hình của riêng bạn.

+1

Oooooooh, những thứ tốt. Tôi thử xem! – Vaccano

+0

+1 Câu trả lời hay. OP cho biết "KHÔNG instantiating MyStaticClass" - và vấn đề là bạn cần phải khởi tạo SOMETHING để hưởng lợi từ việc liên kết phương thức động ở đây. –

+2

+1, Đây là bước đầu tiên hướng tới không còn thực hiện các cuộc gọi tĩnh với các hiệu ứng phụ hoặc các Singletons truy cập tĩnh. Các đối tượng bộ điều hợp có thể giúp bạn lấy mã hiện có với các phụ thuộc tĩnh đang được kiểm tra. Cuối cùng, nhằm mục đích kéo ra các cuộc gọi tĩnh có vấn đề hoàn toàn. –

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