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

时间:2013-06-27 16:44:54

标签: c# unit-testing mocking stub

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

2 个答案:

答案 0 :(得分:0)

我不确定你是否做了正确的事情,想要将基本调用存根或归零。但是,我有一个解决您的问题的方法。我的解决方案是基于这样的假设,即您的课程没有密封且是公开的。

解决方案是在新的受保护虚拟方法中移动base.ResolveDate()。通过这样做,您可以轻松地删除base.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);
    }
}

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

答案 1 :(得分:0)

使用RhinoMocks,您可以这样做(记得包括Rhino.Mocks以及Rhino.Mocks.Interfaces):

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

dateResolver.Stub(x => x.ResolveDate(comparisonSeries, targetDate))
    .CallOriginalMethod(OriginalCallOptions.NoExpectation);