2012-12-17 84 views
5

如何測試它們內部的抽象類和受保護方法?我知道你們中的一些人會建議我不應該測試抽象類,而是測試從它派生出來的類。事情是,我不想那樣做。我想嚴格測試抽象類本身。這裏是樣本類:單元測試抽象類和它們內部的受保護方法

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

    } 

我正在爲它寫一個單元測試。我知道我能做的其中一件事是利用單元測試框架(我有Moq),但我不知道如何在這個特定的實例中使用它。

回答

5

爲了讓您測試您的抽象類,您需要實例化它。因此,爲了測試目的創建一個繼承自您的Component(抽象)類的類。

除了正在使用的接口,我沒有看到太多模擬。

11

你需要使用一個可測試的類來繼承你的類。舉例來說,如果你有一個這樣的類:

public class ProtectedStuff 
{ 
    protected bool MyProtectedMethod() 
    { 
     return true; 
    } 
} 
在你的單元測試組裝

然後,從你的類繼承這樣的:

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

這爲您提供了完全一樣的界面爲一類原來,但現在你可以訪問受保護的方法。

+2

代碼的榮譽。這個答案比@ulises更好 –