有人能非常清楚地告诉我在单元测试期间shim
和stub
之间的主要区别是什么?
我知道有关模拟对象的内容,而且我读过有关填充程序和存根的内容,但我仍然不清楚在哪种情况下我应该使用填充程序或存根。
答案 0 :(得分:7)
让我引用Martin Fowler的文章Mocks Aren't Stubs:
Stubs 通常会为测试期间的通话提供固定答案 根本没有回应任何超出程序的东西 测试。存根也可以记录有关呼叫的信息,例如电子邮件 网关存根,记住它'发送'的消息,或者可能只是如何 它发送的许多消息。
嘲笑是[...] 预编程的对象具有形成规范的期望 他们应该收到的电话。
因此,如果违反预期,模拟可以直接使测试失败。存根不会这样做。
Shims (或Moles)与它们的不同之处在于它们可用于替换静态方法等硬编码依赖项。您应该避免使用IMO并且更喜欢重构,这使得这些依赖项可以替换。有关进一步的讨论,请参阅this thread,尤其是Jim Cooper的回答。
答案 1 :(得分:3)
作为一般指南,使用存根进行Visual Studio解决方案中的调用,并使用shims来调用其他引用的程序集。这是因为在您自己的解决方案中,最好通过以存根所需的方式定义接口来分离组件。但是,System.dll等外部程序集通常没有提供单独的接口定义,因此您必须使用 shims 。
非常好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