如何在方法中存根/模拟对基类的调用
本文关键字:模拟 基类 调用 存根 方法 | 更新日期: 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);