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),但我不知道如何将它用于这个特定的实例。

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(抽象)类继承的类。

除了正在使用的接口之外,我对 Mock 的看法并不多。

于 2012-12-17T04:29:22.843 回答