许多人在编写单元测试时都使用模拟对象。 什么是模拟对象 为什么我需要一个? 我需要模拟对象框架吗?

===============>>#1 票数:35 已采纳

对象模拟用于将依赖项排除在单元测试之外。 有时,您会遇到“ SelectPerson”之类的测试,该测试将从数据库中选择一个人并返回一个Person对象。

为此,通常需要对数据库有依赖性,但是通过对象模拟,您可以使用模拟框架模拟与数据库的交互,因此它可能会返回一个看起来像从数据库返回的数据集,然后可以进行测试您的代码,以确保它能够处理将数据集转换为人员对象的过程,而不是使用它来测试是否存在与数据库的连接。

===============>>#2 票数:17

已经有几个人回答了“什么”,但是我想到了几个简单的“为什么”:

  1. 性能

    因为单元测试应该很快,所以测试与网络,数据库或其他时间密集型资源交互的组件,如果是使用模拟对象完成的,则无需为此付出代价。 节省下来的钱很快就累了。

  2. 合作

    如果您正在编写一个很好封装的代码,需要与其他人的代码进行交互(尚未编写,或者正在并行开发中,这是一种常见情况),则可以在模拟对象中使用模拟对象来执行代码。界面已达成共识。 否则,直到其他组件完成后,您的代码才可能开始进行测试。

===============>>#3 票数:12

模拟对象使您可以对照正在编写的内容以及抽象细节(例如访问资源(磁盘,网络服务等))进行测试。 然后,该模拟让您假装是该外部资源,类或其他内容。

您实际上并不需要模拟对象框架,只需扩展您不想在测试中担心的功能的类,并确保要测试的类可以使用模拟对象而不是真实对象(将其传递给通过构造函数或设置器之类的东西。

练习将显示模拟什么时候有用,什么时候没有帮助。

编辑:模拟资源尤为重要,因此您不必在测试过程中依赖它们的存在,并且可以模拟它们如何存在以及它们如何响应的详细信息(例如模拟FileNotFoundException或缺少的Web服务) ,或Web服务的各种可能的返回值)...都没有涉及到缓慢的访问时间(模拟将比在测试中访问此类资源要快得多)。

===============>>#4 票数:9

我需要模拟对象框架吗?

当然不是。 有时候,手工编写模拟游戏可能会非常乏味。 但是对于简单的事情,这一点也不坏。 将“ 最后负责时刻”的原理应用于模拟框架,只有在向自己证明手写模拟比其价值更大的麻烦时,才应从手写模拟转换为框架。

如果您只是从模拟开始,那么直接跳入框架至少会使您的学习曲线翻倍(可以翻倍曲线吗?)。 当您花了一些项目手工编写模拟时,模拟框架将变得更加有意义。

===============>>#5 票数:6

对象模拟是从接口,抽象类或带有虚拟方法的类中创建“虚拟”或模拟对象的方法。 它允许您将其中一种包装在自己的定义中以进行测试。 这对于制作要测试的特定代码块所依赖的对象很有用。

我喜欢使用的一种流行的叫做Moq ,但是还有许多其他诸如RhinoMock之类的东西,我不知道。

===============>>#6 票数:5

它使您能够测试项目的一部分如何与其余部分交互,而无需构建整个项目并可能丢失重要部分。

编辑:维基百科的一个很好的例子:它允许您事先测试代码,就像汽车设计师使用碰撞测试假人来测试事故期间汽车的行为。

===============>>#7 票数:3

另一个用途是,它将使您可以对系统中尚未构建的其他部分进行测试。 例如,如果您的类依赖于其他类,而该类是其他人正在使用的功能的一部分,则您可以只要求一个几乎完整的接口,对该接口进行编程,并按自己的期望对细节进行模拟。 然后,确保您对接口的假设是正确的(无论是在开发过程中,还是在功能完成后)。

===============>>#8 票数:1

模拟框架是否有用,部分取决于编写代码的语言。 使用静态语言时,您需要付出更多的努力才能使编译器欺骗您的模拟对象,以代替真实对象。 在动态类型的语言(如Python,Ruby或Javascript)中,通常可以将方法附加到任意对象或类上,然后将其作为参数传递-这样,框架的价值将大大减少。

===============>>#9 票数:0

用于.net单元测试的2个推荐的模拟框架是Typemock Isolator和Rhino Mock。

在以下链接中,您可以看到Typemock的解释,说明为什么需要用于单元测试的模拟框架

  ask by Mike Minutillo translate from so

未解决问题?本站智能推荐: