因此,继续我的新年决议以获得更多TDD,我现在开始更多地使用Rhino Mocks.
我真正想要做的一件事就是确保我真正了解我所要做的事情,所以我想检查一下我对目前所看到的情况的理解(我认为最好把它放在这里作为一个资源).
Ross.. 103
Martin Fowler写了一篇关于这个主题的优秀文章.从那篇文章:
Meszaros使用术语Test Double作为任何类型的假装对象的通用术语,代替用于测试目的的真实对象.这个名字来自电影中特技双人的概念.(他的目标之一是避免使用已经广泛使用的任何名称.)Meszaros然后定义了四种特殊的双重:
虚拟对象传递但从未实际使用过.通常它们仅用于填充参数列表.
假对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(内存数据库就是一个很好的例子).
存根提供了在测试期间进行的调用的固定答案,通常不会对测试中编程的任何内容做出任何响应.存根还可以记录有关呼叫的信息,例如记住它'发送'的消息的电子邮件网关存根,或者可能只记录它'发送'的消息.
模拟是我们在这里所讨论的:预编程的对象具有预期,形成了预期接收的调用的规范.
用我自己的话来说:模拟对象"期望"在它们上面调用某些方法,并且如果不满足它们的期望,通常会导致单元测试失败.存根对象提供预设响应(并且可以由辅助库自动生成),但通常不会直接导致单元测试失败.它们通常只是用于使您正在测试的对象获取其工作所需的数据.
Martin Fowler写了一篇关于这个主题的优秀文章.从那篇文章:
Meszaros使用术语Test Double作为任何类型的假装对象的通用术语,代替用于测试目的的真实对象.这个名字来自电影中特技双人的概念.(他的目标之一是避免使用已经广泛使用的任何名称.)Meszaros然后定义了四种特殊的双重:
虚拟对象传递但从未实际使用过.通常它们仅用于填充参数列表.
假对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(内存数据库就是一个很好的例子).
存根提供了在测试期间进行的调用的固定答案,通常不会对测试中编程的任何内容做出任何响应.存根还可以记录有关呼叫的信息,例如记住它'发送'的消息的电子邮件网关存根,或者可能只记录它'发送'的消息.
模拟是我们在这里所讨论的:预编程的对象具有预期,形成了预期接收的调用的规范.
用我自己的话来说:模拟对象"期望"在它们上面调用某些方法,并且如果不满足它们的期望,通常会导致单元测试失败.存根对象提供预设响应(并且可以由辅助库自动生成),但通常不会直接导致单元测试失败.它们通常只是用于使您正在测试的对象获取其工作所需的数据.
"存根"是存在的接口的实现,用于提供某种类型的数据/响应.例如:
一个DataSet
用户列表
一个Xml文件
通常这将由另一个服务(无论是Web服务,另一个应用程序,数据库)提供,但为了提高代码的可测试性,结果是"伪造的".
这样做的一个主要好处是它允许根据预期的数据在单元测试中进行断言.如果由于数据错误而出现错误,则可以轻松添加测试,创建新的存根(复制数据错误)和生成的代码以纠正错误.
Stubs与Mocks的不同之处在于它们用于表示和测试对象的状态,而模拟测试它的交互.
我相信"存根"来自STartUpBlock.它用于指代自动生成的代码部分,以帮助您,开发人员,开始使用.