我是否在我的测试方法中使用垫片垫出公共方法?

本文关键字:方法 是否 我的 测试方法 | 更新日期: 2023-09-27 18:17:09

我还在努力弄清楚Microsoft Fakes中的Shims是如何正确使用的。我知道它是针对运行时方法拦截器的,它允许你为几乎任何方法提供你自己的实现,但让我问一个更单元测试类型的问题。在下面的方法中,我应该去掉PUBLIC STATIC方法并去掉可重写的方法基吗?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);
}

我是否在我的测试方法中使用垫片垫出公共方法?

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

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

然而,如果目标方法的依赖关系很难设置,例如在处理遗留代码时,您可以使用Fakes将目标方法与其依赖关系隔离开来。在本例中,您可以存根ISeries接口并填充DateHelper。PreviousOrCurrentQuarterEnd方法或基。ResolveDate方法。作为一条经验法则,从真实对象开始单元测试,只有当真实对象具有会使单元测试过于缓慢、脆弱或复杂的依赖关系时,才使用存根或垫片。考虑重构那些在你控制下的依赖项,以使测试没有虚假。

Microsoft Fakes的最佳用途之一是将集成测试改为单元测试。例如,准备一些数据并将其写入文件的方法(从某些标准来看技术上过于复杂)可能会让shim重新路由文件。方法,允许您仅单独测试准备代码。

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

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

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

同时,考虑到你的方法的范围,我可能会使用垫片。