垫片和短截线之间的区别

时间:2015-02-04 15:26:54

标签: .net unit-testing

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

我知道有关模拟对象的内容,而且我读过有关填充程序和存根的内容,但我仍然不清楚在哪种情况下我应该使用填充程序或存根。

4 个答案:

答案 0 :(得分:7)

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

  

Stubs 通常会为测试期间的通话提供固定答案   根本没有回应任何超出程序的东西   测试。存根也可以记录有关呼叫的信息,例如电子邮件   网关存根,记住它'发送'的消息,或者可能只是如何   它发送的许多消息。

     

嘲笑是[...]   预编程的对象具有形成规范的期望   他们应该收到的电话。

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

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

答案 1 :(得分:3)

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

enter image description here

非常好reference

答案 2 :(得分:3)

根据我的理解,不同之处在于模拟代码所在的位置或您嘲笑的代码部分(即“where”给出区别)。所以我会把它作为:

  

你打电话给 Stub 你嘲笑的代码部分   如果您模拟一些外部呼叫,则称为 Shim

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

我发现此参考资料不错:My two cents on fakes, stubs, mocks, and shims 特别是部分“一般规则是利用内部调用的存根和外部程序集的填充。

答案 3 :(得分:0)

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

存根示例

// 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