138

所以,继续我的新年决心以更多地参与 TDD,我现在开始更多地使用Rhino Mocks工作。

我热衷于做的一件事是确保我真正了解我正在进入的内容,所以我想检查我对到目前为止所看到的内容的理解(我认为将它作为资源放在这里会很好)。

什么是“存根”?

4

6 回答 6

136

Martin Fowler 写了一篇关于这个主题的优秀文章。从那篇文章:

Meszaros 使用术语 Test Double 作为通用术语,用于代替真实对象用于测试目的的任何类型的假装对象。这个名字来源于电影中特技替身的概念。(他的目标之一是避免使用任何已经被广泛使用的名称。)Meszaros 然后定义了四种特殊类型的双精度:

  • 虚拟对象被传递但从未实际使用过。通常它们仅用于填充参数列表。
  • 假对象实际上有工作实现,但通常采取一些捷径,这使得它们不适合生产(内存数据库就是一个很好的例子)。
  • 存根为测试期间拨打的电话提供预设答案,通常根本不响应任何超出测试程序的内容。存根还可以记录有关呼叫的信息,例如记住它“发送”的消息的电子邮件网关存根,或者可能只记录它“发送”的消息的数量。
  • 模拟就是我们在这里讨论的内容:预先编程的对象具有期望,这些期望形成了它们期望接收的调用的规范。

用我自己的话来说:模拟对象“期望”调用它们的某些方法,如果不满足它们的期望,通常会导致单元测试失败。存根对象提供预设响应(并且可以由帮助程序库自动生成),但通常不会直接导致单元测试失败。它们通常仅用于让您正在测试的对象获得完成其工作所需的数据。

于 2009-01-20T21:57:21.923 回答
32

“存根”是提供某种数据/响应的接口的实现。例如:

  • 一个数据集
  • 用户列表
  • 一个 XML 文件

通常这将由另一个服务(可能是 Web 服务、另一个应用程序、数据库)提供,但为了提高代码的可测试性,结果是“伪造的”。

这样做的一个主要好处是它允许在单元测试中根据预期的数据进行断言。如果由于数据错误而出现错误,则可以轻松添加测试,创建新存根(复制数据错误)并生成代码以纠正错误。

存根Mocks的不同之处在于它们用于表示和测试对象的状态,而 Mock 则测试其交互

于 2009-01-20T21:51:11.843 回答
7

我相信“存根”来自 STARTUpBlock。它用于指代自动生成的代码部分,以帮助您(开发人员)入门。

于 2013-03-08T14:43:19.897 回答
7

我最近遇到了这个问题,并认识到StubDriver之间的这种比较非常清晰且有帮助:

基本上,存根和驱动程序是除了声明自己和它们接受的参数之外实际上不做任何事情的例程。然后,其余代码可以获取这些参数并将它们用作输入。

+---------+-------------------+------- ------------------------------------+
| | 存根 | 司机 |
+---------+-------------------+------- ------------------------------------+
| 类型 | 伪代码 | 伪代码 |
+---------+-------------------+------- ------------------------------------+
| 用于 | 自上而下的集成 | 自下而上的整合 |
+---------+-------------------+------- ------------------------------------+
| 目的 | 允许测试鞋面 | 允许测试下限|
| | 代码的级别,当 | 代码的级别,当 |
| | 较低级别的代码是 | 代码的上层是 |
| | 尚未开发。| 尚未开发。|
+---------+-------------------+------- ------------------------------------+
| 示例 | A 和 B 是组件。| A 和 B 是组件。|
| | A ---> B | A ---> B |
| | | |
| | A已开发。| A 仍需开发。
| | B仍需开发。| B 已开发。|
| | 因此,使用 stub | 因此,使用驱动程序 |
| | 代替B模仿它。| 代替A模仿它|
| | | |
| | A ---> 存根 | 司机---> B |
+---------+-------------------+------- ------------------------------------+

存根和驱动程序之间的区别

于 2018-04-22T16:03:50.860 回答
4

“存根”或“存根方法”被设计为入门代码或尚未开发的代码的临时替代品。它是由 IDE 生成的内置代码。存根方法实际上是用于测试特定类的方法的方法。它用于在您的实际开发方法中为局部变量输入一些值并检查输出是否正确。找出代码中的错误很重要。

于 2018-01-13T03:43:50.370 回答
0

经过一些研究并基于我在编码人员生活中遇到的存根文件,我会说存根文件只是一个包含文件的全部或部分实现的文件。它可以帮助开发人员开始编码。

于 2019-01-28T20:42:58.287 回答