2012-12-17 21 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; 
     } 

    } 

私はユニットテストを書いています。私ができることの1つはユニットテストフレームワーク(私はMoqを持っている)を利用することですが、私はこの特定のインスタンスのためにそれをどのように使用するかについて考えていません。

答えて

5

抽象クラスをテストするためには、インスタンス化する必要があります。したがって、Component(abstract)クラスを継承するテスト目的のクラスを作成します。

使用されているインターフェイスを除いて、私はモックにはあまり見られません。

11

テスト中のクラスから継承する「テスト可能」クラスを使用する必要があります。あなたはこのようなクラスがある場合たとえば、:

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

を次に、あなたのユニットテストアセンブリ内で、このようなあなたのクラスから継承:

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

これは、あなたとまったく同じインターフェイスを持つクラスを提供します元の、しかし今あなたは保護されたメソッドにアクセスすることができます。

+2

コード用の名誉です。この回答は@ulisesよりはるかに優れています –