0

我仍在试图弄清楚 Microsoft Fakes 中的垫片的正确用途。我知道它适用于运行时方法拦截器,它允许您为几乎任何方法提供自己的实现,但让我问一个更单元测试类型的问题。在下面的方法中,我是否应该填充 PUBLIC STATIC 方法并存根可覆盖的方法 base.ResolveDate(comparisonSeries, targetDate)?我应该只测试里面ResolveDate()的东西而不是别的吗?这似乎是您使用单元测试正确测试方法的方式。只需测试该方法,除非该方法嵌套了私有方法调用,在这种情况下,您将通过这些私有方法运行单元测试(根据 Roy Osherove 的“单元测试艺术”,您不会独立测试私有方法)。

public override DateTime ResolveDate(ISeries comparisonSeries, DateTime targetDate)
{
   if (comparisonSeries == null)
   {
      throw new ArgumentNullException("comparisonSeries");
   }

   switch (comparisonSeries.Key)
   {               
      case SeriesKey.SomeKey1:
      case SeriesKey.SomeKey2:
      case SeriesKey.SomeKey3:
      case SeriesKey.SomeKey4:
      case SeriesKey.SomeKey5:
      return DateHelper.PreviousOrCurrentQuarterEnd(targetDate);
   }
   return base.ResolveDate(comparisonSeries, targetDate);
}
4

2 回答 2

1

在大多数情况下,不必将目标方法与其调用的私有类或成员隔离开来。假设 DateHelper.PreviousOrCurrentQuarterEnd 和 base.ResolveDate 有自己的单元测试,则可以对重写的 ResolveDate 方法进行单元测试以验证

a) 对于 SeriesKey 的特殊值,它会返回 DateHelper.PreviousOrCurrentQuarterEnd 预期的结果。b) 对于 SeriesKey 的所有其他值,它返回一个预期来自 base.ResolveDate 的结果。

但是,如果目标方法的依赖项很难设置,例如在处理遗留代码时,您可以使用 Fakes 将目标方法与其依赖项隔离开来。在此示例中,您可以存根 ISeries 接口并填充 DateHelper.PreviousOrCurrentQuarterEnd 方法或 base.ResolveDate 方法。根据经验,使用真实对象开始单元测试并仅在真实对象具有会使单元测试太慢、脆弱或复杂的依赖项时才使用存根或填充程序。考虑重构那些在您控制之下的依赖项,以启用没有假货的测试。

于 2013-06-17T15:24:07.663 回答
0

Microsoft Fakes 的最佳用途之一是制作集成测试单元测试的测试。例如,准备一些数据并将其写入文件的方法(按照某些标准在技术上过于复杂)可以让填充程序重新路由 File.Write 方法,从而允许您仅单独测试准备代码。

另一方面,需要垫片的设计在技术上是一个糟糕的设计。在许多情况下它会发生,但在可能的情况下,方法应该只做一件事并使用依赖注入将不相关的部分分开。然后,您可能有一个方法,例如为SaveFile(SomeObject source, IFileManager manager)写入逻辑传入一个存根。

在您的情况下,这是单元测试中比较困难的部分之一。基类可能在其他地方进行了测试,您不想在方法的测试中测试它的代码 - DateHelper 调用也是如此。

然而,问题是您的测试将依赖于这两种方法的垫片。如果实现发生变化,但结果没有变化,您的测试可能会失败。这是测试时应该避免的事情。结果的变化应该会破坏测试,但重构或优化不应该。

同时,鉴于您的方法的范围,我可能还是会使用垫片。

于 2013-10-08T15:51:57.503 回答