2010-06-24 48 views
5

Tôi có lớp CacheManager này giữ một từ điển tĩnh với tất cả các loại dữ liệu được lưu trong bộ nhớ cache. Tuy nhiên, với từ điển này là tĩnh nó được lấp đầy với dữ liệu từ các bài kiểm tra đơn vị khác. Điều này giúp tôi kiểm tra đơn vị liệu CacheManager có trống trên init hay không và phá vỡ nguyên tắc kiểm thử đơn vị.Kiểm tra đơn vị CacheManager

Bất kỳ ý tưởng nào về cách tạo thử nghiệm đơn vị thích hợp cho điều này?

public class CacheManager 
{ 
    private static readonly Dictionary<ICacheKey, ListCacheItem> cacheEntries = 
     new Dictionary<ICacheKey, ListCacheItem>(); 

    public static Dictionary<ICacheKey, ListCacheItem> CacheEntries 
    { 
     get 
     { 
      lock (cacheEntries) 
      { 
       return cacheEntries; 
      } 
     } 
    } 

Trả lời

1

Nói chung, đây không phải là một ý tưởng tốt từ góc độ thử nghiệm. Bằng cách làm cho các thành viên của CacheManager tĩnh, bạn sẽ không bao giờ có thể cô lập nó theo cách như vậy để làm cho nó tốt đẹp để kiểm tra đơn vị.

Có lẽ giải pháp tốt hơn là Singleton Pattern. Để thực hiện việc này, hãy loại bỏ các công cụ sửa đổi tĩnh trên các thành viên của CacheManager. Sau đó, bạn có thể có một phiên bản tĩnh trong ứng dụng của mình được mọi người khác sử dụng. Do đó, trong bài kiểm tra đơn vị của bạn, bạn có thể tạo một thể hiện mới của lớp mà bạn có thể thử nghiệm riêng biệt, nhưng vẫn có chức năng mong muốn.

+0

Làm cách nào tốt hơn? Không phải singleton cũng giữ giá trị giữa các bài kiểm tra? – koenmetsu

+0

Đúng, Singleton sẽ. Nhưng bạn có thể tự khởi tạo 'CacheManager' và kiểm tra các thành viên của nó trong sự cô lập. Sau đó, trong các thử nghiệm khác, ví dụ, bạn có thể chắc chắn rằng tất cả các phần khác của ứng dụng của bạn đang sử dụng cùng một cá thể Singleton. – dyross

+0

Vì vậy, thực sự giải pháp của bạn sẽ là tạo ra một lớp Singleton mới có chứa một thể hiện của CacheManager là một trong những thành viên của nó? – koenmetsu

1

Câu trả lời ngắn gọn: bạn không thể làm điều đó đúng cách. Đơn vị kiểm tra và thống kê không chơi thực sự tốt với nhau, bạn sẽ (hầu như) luôn luôn chạy vào các vấn đề như một trong những bạn đề cập.

Câu trả lời dài hơn: giải pháp tốt nhất là cấu trúc lại mã của bạn. Ngay cả khi bạn cần hành vi đơn lẻ, bạn có một số tùy chọn (ví dụ: tiêm phụ thuộc). Đề nghị của David là tất nhiên cũng là một lựa chọn ít nhất sẽ cho phép bạn kiểm tra bộ nhớ cache của bạn, nhưng bạn vẫn có thể có vấn đề khi bạn muốn kiểm tra phần còn lại của hệ thống.

Nếu vì một số lý do bạn muốn dính vào thiết kế hiện tại của mình, bạn vẫn có thể có một số cách giải quyết (không cần thiết tốt). Một số ví dụ:

Dễ nhất có thể là thêm phương thức "cleanCache". Trong một số trường hợp, nó có thể hữu ích cho phần còn lại của hệ thống, và mỗi bài kiểm tra của bạn cũng có thể làm điều đó như bước đầu tiên (trong "setup/beforeTest hoặc các phương thức tương tự").

Bạn cũng có thể chơi với khả năng hiển thị và để cho các bài kiểm tra của bạn làm sạch mà không được phép cho phần còn lại của mã.

Các hacks này có thể sẽ hoạt động miễn là bạn không chạy thử nghiệm song song.