如何在方法中存根/模拟对基类的调用

本文关键字:模拟 基类 调用 存根 方法 | 更新日期: 2023-09-27 18:20:06

我有一个需要测试的方法,在该方法内部有一个对同一基类方法的调用。要编写单元测试,我需要模拟/截断这个"base.RevolveDate(comparisonSeries,targetDate)"方法吗?我该怎么做?我认为在这里提取一个接口是行不通的!

public override DateTime ResolveDate(ISeries comparisonSeries, DateTime targetDate)
{
    if (comparisonSeries == null)
    {
        throw new ArgumentNullException("comparisonSeries");
    }
    switch (comparisonSeries.Key)
    {
        case SeriesKey.R1:
        case SeriesKey.R2:
        case SeriesKey.R3:
        case SeriesKey.R4:
        case SeriesKey.R5:
            return DateHelper.PreviousOrCurrentQuarterEnd(targetDate);
    }
    return base.ResolveDate(comparisonSeries, targetDate);
}

如何在方法中存根/模拟对基类的调用

我不确定您想要存根还是将基调用清零,这是否是正确的做法。不过,我有办法解决你的问题。我的解决方案基于这样一个假设,即您的类不是密封的,它是公共的。

解决办法是移动基地。在新的受保护虚拟方法中调用ResolveDate()。通过这样做,您将能够很容易地移除底座。ResolveDate()调用。在测试代码中,为了进行单元测试,您必须从类派生一个新类,然后将新添加的受保护虚拟方法重写为no-op。

重构生产代码后,它应该是这样的:

public class MyClass : SomeBaseClass
{
    public override DateTime ResolveDate(object someinput)
    {
        if (ConditionMet(someinput))
            return ResolveDateMyLogic(someinput);
        return ResolveDateUsingBaseLogic(someinput);
    }
    private bool ConditionMet(object someInput)
    {
        return true;
    }
    private DateTime ResolveDateMyLogic(object someinput)
    {
        return DateTime.Now;
    }
    protected virtual DateTime ResolveDateUsingBaseLogic(object someinput)
    {
        return base.ResolveDate(someinput);
    }
}

希望它能解决你的问题。

使用RhinoMocks可以做到这一点(记住要包括Rhino.Mocks和Rhino.Moks.Interfaces):

var dateResolver = MockRepository.GenerateStub<BaseDateResolver>();
dateResolver.Stub(x => x.ResolveDate(comparisonSeries, targetDate))
    .CallOriginalMethod(OriginalCallOptions.NoExpectation);