2012-12-17 24 views
5

làm cách nào để tôi có thể kiểm tra các lớp trừu tượng và các phương thức được bảo vệ bên trong chúng? Tôi biết một số bạn sẽ đề nghị rằng tôi không nên kiểm tra lớp trừu tượng, nhưng thay vào đó hãy kiểm tra các lớp có nguồn gốc từ nó. Thing là, tôi không muốn làm điều đó. Tôi muốn kiểm tra nghiêm ngặt lớp trừu tượng. Đây là lớp mẫu:các lớp trừu tượng thử nghiệm đơn vị và các phương pháp được bảo vệ bên trong chúng

public interface IF_SystemMessageHandler 
{ 
    ... 
} 

public interface IF_SystemMessageSender 
{ 
    ... 
} 

    public abstract class Component : IF_SystemMessageSender 
    { 

     private eVtCompId mComponentId; 
     private eLayer mLayerId; 
     private IF_SystemMessageHandler mLogger; 

     protected Component(eVtCompId inComponentId, eLayer inLayerId, IF_SystemMessageHandler inMessageHandler) 
     { 
      mLayerId = inLayerId; 
      mComponentId = inComponentId; 
      mLogger = inMessageHandler; 
     } 

     protected void SendSystemMessage(ref eSystemMsgLevel inSystemMsgLevel, ref string inSysMsg) 
     { 
      mLogger.SendSystemMessage(...); 
     } 

     protected void SendSystemMessage(ref eSystemMsgLevel inSystemMsgLevel, ref eTextId inSysMsgID) 
     { 
      mLogger.SendSystemMessage(...); 
     } 

     public void SetMessageHandler(ref IF_SystemMessageHandler InSystemMessageHandler) 
     { 
      mLogger = InSystemMessageHandler; 
     } 

    } 

Tôi đang viết một bài kiểm tra đơn vị cho nó. Tôi biết rằng một trong những điều tôi có thể làm là sử dụng một khung kiểm thử đơn vị (tôi có Moq), nhưng tôi không có ý tưởng về cách sử dụng nó cho trường hợp cụ thể này.

Trả lời

5

Để bạn có thể kiểm tra lớp trừu tượng của mình, bạn cần phải thực hiện nó. Vì vậy, hãy tạo một lớp cho mục đích thử nghiệm kế thừa từ lớp học Component (trừu tượng) của bạn.

Ngoài các giao diện đang được sử dụng, tôi không thấy nhiều đối với Mock.

11

Bạn cần sử dụng lớp 'có thể kiểm tra' được kế thừa từ lớp của bạn đang được kiểm tra. Ví dụ, nếu bạn có một lớp học như thế này:

public class ProtectedStuff 
{ 
    protected bool MyProtectedMethod() 
    { 
     return true; 
    } 
} 

Sau đó, trong lắp ráp thử nghiệm đơn vị của bạn, kế thừa từ lớp học của bạn như thế này:

public class TestableProtectedStuff : ProtectedStuff 
{ 
    public new bool MyProtectedMethod() 
    { 
     return base.MyProtectedMethod(); 
    } 
} 

này mang đến cho bạn một lớp với chính xác các giao diện tương tự như bản gốc, nhưng bây giờ bạn có thể truy cập các phương thức được bảo vệ.

+2

Kudo cho mã. Câu trả lời này tốt hơn nhiều so với câu trả lời của @ulises –