【问题标题】:Do I shim out public methods in my tested method using shims?我是否使用垫片在我的测试方法中填充公共方法?
【发布时间】:2013-10-08 23:51:57
【问题描述】:

我仍在试图弄清楚 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);
}

【问题讨论】:

  • 简而言之,是的。 ResolveDate() 是您最终要返回的对象,所以在我看来,它是这个覆盖的焦点。

标签: c# unit-testing microsoft-fakes


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2016-09-08
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多