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