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を持っています)を利用することですが、この特定のインスタンスでそれをどのように使用するかについてはわかりません。

4

2 に答える 2

16

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

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

次に、単体テストアセンブリで、次のようにクラスから継承します。

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

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

于 2012-12-17T08:07:03.317 に答える
5

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

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

于 2012-12-17T04:29:22.843 に答える