【问题标题】:Difference between shims and stubs垫片和存根之间的区别
【发布时间】:2018-10-24 21:54:14
【问题描述】:

谁能非常清楚地告诉我在单元测试期间shimstub 之间的主要区别是什么?

我了解模拟对象,也了解过 shims 和 stub,但仍不清楚在哪种情况下应该使用 shim 或 stub。

【问题讨论】:

    标签: .net unit-testing


    【解决方案1】:

    让我引用 Martin Fowler 的文章Mocks Aren't Stubs

    存根为测试期间拨打的电话提供预设答案,通常 完全不响应编程之外的任何内容 测试。存根还可以记录有关呼叫的信息,例如电子邮件 记住它“发送”的消息的网关存根,或者可能只是如何 它“发送”了许多消息。

    模拟是 [...] 预编程的对象形成了一个规范的期望 他们预计会收到的电话。

    因此,如果违反预期,模拟可以直接使测试失败。存根不这样做。

    Shims(或 Moles)与它们两者的不同之处在于它们可以用来替换像静态方法这样的硬编码依赖项。您应该避免使用 IMO 并更喜欢重构,这使得这些依赖关系可替换。请参阅this thread 进行进一步讨论,尤其是 Jim Cooper 的回答。

    【讨论】:

    • 我建议您先获得一些经验,然后再担心使用测试替身的细节。祝你好运!
    【解决方案2】:

    作为一般指南,在您的 Visual Studio 解决方案中使用 stubs 进行调用,并使用 shims 调用其他引用的程序集。这是因为在您自己的解决方案中,通过以存根所需的方式定义接口来解耦组件是一种很好的做法。但 System.dll 等外部程序集通常不提供单独的接口定义,因此您必须改用 shims

    很好reference

    【讨论】:

    • 我们也可以使用 shims 编写集成测试吗?
    【解决方案3】:

    据我了解,区别在于模拟代码所在的位置或您模拟的代码部分(即“位置”给出了区别)。所以我会这样说:

    你调用 Stub 你模拟的代码部分,而它会 如果您模拟一些外部调用,则称为 Shim

    • “你的代码”是要测试的代码
    • “外部调用”是你的代码所依赖的依赖

    我觉得这个参考很好:My two cents on fakes, stubs, mocks, and shims 尤其是“一般规则是利用存根进行内部调用和 shims 进行外部程序集。

    【讨论】:

      【解决方案4】:

      Shims 通常用于从您的解决方案外部的程序集中提供模拟,而存根用于在您的解决方案中创建类的模拟。

      存根示例

      // Create the fake calculator:
      ICalculator calculator = new Calculator.Fakes.StubICalculator()
      {
      // Define each method:
      Add = (a,b) => { return 25; }
      };
      

      垫片示例

      //Using shims to control the response to DateTime.Now
      using (ShimsContext.Create())
      {
      // insert the delegate that returns call for DateTime.Now
      System.Fakes.ShimDateTime.NowGet = () => new DateTime(2010, 1, 1);
      MethodThatUsesDateTimeNow();
      }
      

      礼貌:考试参考 70-486

      【讨论】:

        猜你喜欢
        • 2011-09-29
        • 2019-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多