2

我有一个需要测试的方法,并且在该方法内部调用了相同的基类方法。要编写单元测试,我需要模拟/存根这个'base.ResolveDate(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);
}
4

2 回答 2

0

我不确定您是否通过想要存根或将碱基调用归零来做正确的事情。但是,我有一个解决您的问题的方法。我的解决方案是基于你的类不是密封的并且是公开的假设。

解决方案是将 base.ResolveDate() 调用移动到新的受保护虚拟方法中。通过这样做,您将能够轻松删除 base.ResolveDate() 调用。在您的测试代码中,您必须从您的类派生一个新类以进行单元测试,然后将新添加的受保护虚拟方法覆盖为无操作。

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

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

希望,它能解决你的问题。

于 2013-06-27T17:10:24.053 回答
0

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

var dateResolver = MockRepository.GenerateStub<BaseDateResolver>();

dateResolver.Stub(x => x.ResolveDate(comparisonSeries, targetDate))
    .CallOriginalMethod(OriginalCallOptions.NoExpectation);
于 2013-09-05T09:26:33.370 回答