2012-12-17 16 views
5

Jak mogę przetestować klasy abstrakcyjne i metody chronione w nich? Wiem, że niektórzy z was zasugerują, że nie powinienem testować klasy abstrakcyjnej, a raczej testować klasy, które z niej wypływają. Chodzi o to, że nie chcę tego robić. Chcę dokładnie przetestować samą klasę abstrakcyjną. Oto przykładowa klasa:testowanie jednostkowe klas abstrakcyjnych i chronionych metod wewnątrz nich

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; 
     } 

    } 

Piszę test jednostkowy dla niego. Wiem, że jedną z rzeczy, które mogę zrobić, jest wykorzystanie frameworka do testowania jednostkowego (mam Moq), ale nie mam pojęcia, jak go użyć w tym konkretnym przypadku.

Odpowiedz

5

Aby przetestować swoją klasę abstrakcyjną, musisz ją utworzyć. Utwórz więc klasę do celów testowych, która dziedziczy po klasie Component (abstrakcyjnej).

Oprócz używanych interfejsów nie widzę zbyt wiele dla makiety.

11

Musisz użyć klasy "testowalnej", która dziedziczy z testowanej klasy. Na przykład, jeśli masz klasę tak:

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

Następnie w zespole testów jednostkowych, dziedziczą z klasy tak:

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

To daje klasę z dokładnie tego samego interfejsu, co oryginał, ale teraz możesz uzyskać dostęp do chronionych metod.

+2

Kudos za kody. Ta odpowiedź jest o wiele lepsza niż odpowiedzi –

Powiązane problemy