什么是对象嘲笑,我什么时候需要它?

许多人在编写unit testing时使用模拟对象。 什么是模拟对象 ? 为什么我会需要一个? 我需要一个模拟对象框架吗?

对象嘲弄是用来保持你的unit testing的依赖。 有时你会有一个像“SelectPerson”这样的testing,它将从数据库中select一个人并返回一个Person对象。

要做到这一点,通常需要依赖数据库,但是通过对象模拟,你可以用模拟框架模拟与数据库的交互,所以它可能返回一个看起来像数据库返回的数据集,然后你可以testing您的代码以确保它处理将数据集转换为人员对象,而不是使用它来testing与数据库的连接是否存在。

有几个人已经回答了“什么”,但是这里有几个我能想到的“快”:

  1. 性能

    因为unit testing应该是快速的,所以testing一个与networking,数据库或其他时间密集型资源交互的组件,如果使用模拟对象完成,则不需要付出代价。 节省加起来很快。

  2. 合作

    如果你正在编写一个需要与其他人的代码进行交互的代码(这个代码还没有被写入,或者正在并行开发 – 一种常见的情况),那么你可以使用模拟对象来执行代码界面已经达成一致。 否则,您的代码可能无法开始testing,直到其他组件完成。

一个模拟对象可以让你testing你正在编写的内容,以及诸如访问资源(磁盘,networking服务等)的抽象细节。 然后模拟让你假装成为外部资源,或者类或者其他任何东西。

你并不需要一个模拟对象框架,只是在你的testing中扩展你不想担心的function的类,并确保你正在testing的类可以使用你的模拟而不是真实的东西(通过它通过构造函数或setter或其他东西。

当嘲笑有帮助时,实践将显示,当他们不是。

编辑:嘲笑资源是特别重要的,所以你不必依靠他们在testing过程中存在,你可以嘲笑他们如何存在的细节和他们的反应(如模拟FileNotFoundException,或缺less的web服务,或者一个web服务的各种可能的返回值)…都没有涉及缓慢的访问时间(在testing中嘲笑将比访问这些资源要快得多)。

我需要一个模拟对象框架吗?

当然不是。 有时候,用手写嘲笑可能会很乏味。 但是对于简单的事情来说,这并不坏。 应用“ 最后责任时刻”的原则来嘲笑框架,当你向自己certificate手写模拟比其价值更麻烦时,你只能从手写模拟切换到框架。

如果你刚刚开始嘲笑,直接跳到框架将至less加倍你的学习曲线(你可以加倍曲线?)。 嘲笑框架将更有意义,当你花了几个项目手动写嘲笑。

对象Mocking是一种通过虚拟方法从接口,抽象类或类创build“虚拟”或模拟对象的方法。 它允许你在自己​​的定义中包装其中的一个来进行testing。 对于您正在testing的某个代码块所依赖的对象是非常有用的。

我喜欢使用的一个stream行的叫做Moq ,但是还有很多像RhinoMock和其他许多我不知道的。

它可以让你testing你的项目的一个部分如何与其他部分相互作用,而不是build立整个事物,并可能失去一个重要的部分。

编辑:维基百科的好例子:它允许你事先testing代码,就像一个汽车devise师使用碰撞testing假人来testing一辆车在事故中的行为。

另一个用途是它可以让你testing系统中尚未构build的其他部分。 例如,如果你的类依赖于别人正在工作的function的一部分的其他类,你可以要求一个大部分完整的接口,编程接口,只是嘲笑的细节,因为你期望他们的工作。 然后,确保您对界面的假设是正确的(无论是在开发中,还是在function完成时)。

你是否是一个模拟框架是有用的,部分取决于你正在编写的代码的语言。 用一种静态语言,你需要付出额外的努力,以欺骗编译器接受你的模拟对象作为真实的东西的替代品。 在诸如Python,Ruby或Javascript之类的dynamictypes语言中,通常可以将方法附加到任意对象或类上,并将其作为parameter passing – 因此框架会增加更less的值。

2推荐嘲笑框架.netunit testing是Typemock隔离器和Rhino模拟。

在下面的链接中,你可以看到Typemock的一个解释,为什么你需要一个unit testing的模拟框架 。