Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 垫片和短柱之间的差异_.net_Unit Testing - Fatal编程技术网

.net 垫片和短柱之间的差异

.net 垫片和短柱之间的差异,.net,unit-testing,.net,Unit Testing,有谁能非常清楚地告诉我在单元测试期间垫片和存根之间的主要区别是什么 我知道模拟对象,也读过垫片和存根,但还不清楚应该在哪种情况下使用垫片或存根。让我引用Martin Fowler的文章: 存根通常为测试期间拨打的电话提供固定答案 对程序之外的任何东西都没有反应 测试。存根还可以记录有关呼叫的信息,例如电子邮件 网关存根,它可以记住它“发送”的消息,或者只记住如何发送的消息 它“发送”了许多信息 模拟是[…] 预先编程的对象,其期望值构成 他们预计会接到的电话 因此,如果违反了预期,mock可以直

有谁能非常清楚地告诉我在单元测试期间
垫片
存根
之间的主要区别是什么


我知道模拟对象,也读过垫片和存根,但还不清楚应该在哪种情况下使用垫片或存根。

让我引用Martin Fowler的文章:

存根通常为测试期间拨打的电话提供固定答案 对程序之外的任何东西都没有反应 测试。存根还可以记录有关呼叫的信息,例如电子邮件 网关存根,它可以记住它“发送”的消息,或者只记住如何发送的消息 它“发送”了许多信息

模拟是[…] 预先编程的对象,其期望值构成 他们预计会接到的电话

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


垫片(或MOLE)与这两种垫片的不同之处在于,它们可以用来替换硬编码依赖项,如静态方法。您应该避免使用IMO,而更喜欢重构,这样可以替换这些依赖项。有关进一步的讨论,请参见,特别是Jim Cooper的回答。

作为一般指南,在Visual Studio解决方案中使用存根进行调用,在调用其他引用的程序集时使用垫片。这是因为在您自己的解决方案中,通过以stubing所需的方式定义接口来解耦组件是一种很好的做法。但是外部程序集(如System.dll)通常没有单独的接口定义,因此必须使用垫片


很好。

从我的理解来看,区别在于模拟代码所在的位置或模拟代码的哪一部分(即“where”给出了区别)。所以我把它说成:

您可以调用存根您在代码运行时模拟的代码部分 如果您模拟一些外部调用,则被称为垫片

  • “您的代码”是要测试的代码
  • “外部调用”是代码所依赖的依赖项
我觉得这个参考很好:
esp部分“一般规则是利用存根进行内部调用,利用垫片进行外部程序集。”

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

存根示例

// 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();
}
垫片示例

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

我建议先积累一些经验,然后再考虑双打的细节。祝你好运我们是否也可以使用垫片编写集成测试?