Rob*_*per 111 testing tdd unit-testing stub
因此,继续我的新年决议以获得更多TDD,我现在开始更多地使用Rhino Mocks.
我真正想要做的一件事就是确保我真正了解我所要做的事情,所以我想检查一下我对目前所看到的情况的理解(我认为最好把它放在这里作为一个资源).
Ros*_*oss 103
Martin Fowler写了一篇关于这个主题的优秀文章.从那篇文章:
Meszaros使用术语Test Double作为任何类型的假装对象的通用术语,代替用于测试目的的真实对象.这个名字来自电影中特技双人的概念.(他的目标之一是避免使用已经广泛使用的任何名称.)Meszaros然后定义了四种特殊的双重:
- 虚拟对象传递但从未实际使用过.通常它们仅用于填充参数列表.
- 假对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(内存数据库就是一个很好的例子).
- 存根提供了在测试期间进行的调用的固定答案,通常不会对测试中编程的任何内容做出任何响应.存根还可以记录有关呼叫的信息,例如记住它'发送'的消息的电子邮件网关存根,或者可能只记录它'发送'的消息.
- 模拟是我们在这里所讨论的:预编程的对象具有预期,形成了预期接收的调用的规范.
用我自己的话来说:模拟对象"期望"在它们上面调用某些方法,并且如果不满足它们的期望,通常会导致单元测试失败.存根对象提供预设响应(并且可以由辅助库自动生成),但通常不会直接导致单元测试失败.它们通常只是用于使您正在测试的对象获取其工作所需的数据.
Rob*_*per 30
"存根"是存在的接口的实现,用于提供某种类型的数据/响应.例如:
通常这将由另一个服务(无论是Web服务,另一个应用程序,数据库)提供,但为了提高代码的可测试性,结果是"伪造的".
这样做的一个主要好处是它允许根据预期的数据在单元测试中进行断言.如果由于数据错误而出现错误,则可以轻松添加测试,创建新的存根(复制数据错误)和生成的代码以纠正错误.
Stubs与Mocks的不同之处在于它们用于表示和测试对象的状态,而模拟测试它的交互.
“存根”或“存根方法”被设计为起始代码或尚未开发的代码的临时替代品。它是由 IDE 生成的内置代码。存根方法实际上是用于测试特定类的方法的方法。在实际开发过程中,通过输入一些局部变量的值,并检查输出是否正确来使用。查找代码中的错误非常重要。
我最近遇到了这个问题,并认识到Stub和Driver之间的这种比较非常清晰和有帮助:
基本上,存根和驱动程序是除了声明它们自己和它们接受的参数之外实际上不做任何事情的例程。然后,其余代码可以采用这些参数并将它们用作输入。
+---+--------------------------------+------- -----------+ | | 存根 | 司机 | +---+--------------------------------+------- -----------+ | 类型 | 虚拟代码 | 虚拟代码 | +---+--------------------------------+------- -----------+ | 用于 | 自顶向下集成 | 自下而上集成 | +---+--------------------------------+------- -----------+ | 目的 | 允许测试鞋面 | 允许测试较低的| | | 代码的级别,当 | 代码的级别,当 | | | 较低级别的代码是 | 代码的上层是 | | | 尚未开发。| 尚未开发。| +---+--------------------------------+------- -----------+ | 示例 | A 和 B 是组件。| A 和 B 是组件。| | | A ---> B | A ---> B | | | | | | | A 已开发。| A 仍然需要开发。 | | B 还需要开发。| B 已开发。| | | 因此,使用存根 | 因此,使用驱动程序 | | | 代替B模仿它。| 代替A模仿它| | | | | | | A ---> 存根 | 驱动程序---> B | +---+--------------------------------+------- -----------+