【发布时间】:2018-10-24 21:54:14
【问题描述】:
谁能非常清楚地告诉我在单元测试期间shim 和stub 之间的主要区别是什么?
我了解模拟对象,也了解过 shims 和 stub,但仍不清楚在哪种情况下应该使用 shim 或 stub。
【问题讨论】:
标签: .net unit-testing
谁能非常清楚地告诉我在单元测试期间shim 和stub 之间的主要区别是什么?
我了解模拟对象,也了解过 shims 和 stub,但仍不清楚在哪种情况下应该使用 shim 或 stub。
【问题讨论】:
标签: .net unit-testing
让我引用 Martin Fowler 的文章Mocks Aren't Stubs:
存根为测试期间拨打的电话提供预设答案,通常 完全不响应编程之外的任何内容 测试。存根还可以记录有关呼叫的信息,例如电子邮件 记住它“发送”的消息的网关存根,或者可能只是如何 它“发送”了许多消息。
模拟是 [...] 预编程的对象形成了一个规范的期望 他们预计会收到的电话。
因此,如果违反预期,模拟可以直接使测试失败。存根不这样做。
Shims(或 Moles)与它们两者的不同之处在于它们可以用来替换像静态方法这样的硬编码依赖项。您应该避免使用 IMO 并更喜欢重构,这使得这些依赖关系可替换。请参阅this thread 进行进一步讨论,尤其是 Jim Cooper 的回答。
【讨论】:
作为一般指南,在您的 Visual Studio 解决方案中使用 stubs 进行调用,并使用 shims 调用其他引用的程序集。这是因为在您自己的解决方案中,通过以存根所需的方式定义接口来解耦组件是一种很好的做法。但 System.dll 等外部程序集通常不提供单独的接口定义,因此您必须改用 shims。
很好reference。
【讨论】:
据我了解,区别在于模拟代码所在的位置或您模拟的代码部分(即“位置”给出了区别)。所以我会这样说:
你调用 Stub 你模拟的代码部分,而它会 如果您模拟一些外部调用,则称为 Shim。
我觉得这个参考很好:My two cents on fakes, stubs, mocks, and shims 尤其是“一般规则是利用存根进行内部调用和 shims 进行外部程序集。”
【讨论】:
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
【讨论】: