为什么我需要一个嘲笑框架为我的单位testing?

最近围绕.NET世界中所有不同的嘲笑框架都有相当多的炒作。 我还没有完全掌握他们的优点。 编写我自己需要的模拟对象似乎并不难。 特别是在Visual Studio的帮助下,我可以快速编写一个实现我想要模拟的接口的类(它为我自动生成几乎所有的东西),然后为我testing所需的方法编写一个实现。 完成! 为了节省几行代码的唯一目的,为什么要理解一个嘲笑框架的麻烦。 或者是一个嘲笑的框架不仅是关于保存代码行?

一旦我终于得到了模拟对象的悬挂,我意识到它们对于unit testing是必不可less的,因为双盲testing或对照组对于科学试验是必不可less的:它们将你实际testing的东西隔离开来。

如果您正在testing一个通过其他接口进行相互交互的类,那么您不但可以节省代码,而且还可以模拟每个接口,而且还可以执行诸如“抛出exception如果这些方法被乱序调用,一个意想不到的方法被称为“或”exception“。 你可以使用模拟框架得到非常复杂的结果,尽pipe我很快就会承认这有一个很大的学习曲线,当你加快速度的时候,它们会帮助你的unit testing更加彻底,而不会臃肿。

你实际上在你的问题中确定了一个模拟框架的关键点之一。 你自己编写模拟的事实不是开发人员应该关心的事情。 模拟框架以编程方式为您提供了接口的实现,并且它们是function性的(基于您对模拟的设置)。

例如,如果您正在testingICustomerDAO,那么您要做什么,并且您想要testing某种方法,每种方法都有不同的结果? 手动实现14个不同的类 我怀疑有人会这样做。

嘲笑给你的权力来定义,当你不关心他们是否会真正的工作,如抛出exception,当你想要他们,返回零结果,并确保你正确处理,等等会发生什么与你的类的一部分。 …

他们是一个伟大的unit testing工具。

以前的问题可能有帮助:
什么是模拟,什么时候应该使用它?
Mockist vs经典的TDD

我发现使用模拟框架可以使我更快地生成testing,并且更好地validation我期望在testing中发生的实际情况。 我过去曾经自己实施过存根或假货。 我发现我需要生成特定于我想要的testing的存根,这花了很多时间。 我可以使用模拟框架更快地创build相同的testing。 好的支持生成假货,存根或模仿的语法。

需要一段时间才能掌握它,我避免了一段时间,但现在不会因为“哈米兰”的原因而不去尝试没有嘲弄的框架。

Roy Osherove对模拟框架进行了一次调查,并在评论部分进行了一次讨论(尽pipe简短),是否需要模拟框架。

我个人一直按照你所说的那样手动地进行操作,它已经运行得很好,但是这主要是出于习惯,而不是对模拟框架总体上持密的看法。

那么我当然不认为你需要一个嘲弄的框架。 这是一个像其他任何框架,它最终旨在为您节省一些时间和精力。 你也可以做一些事情,比如使用自己的通用数据结构,比如堆栈和队列,但是使用那些内置在你的语言的编译器/ IDE中的类库是比较容易的。

我相信使用嘲讽框架有其他令人信服的理由,尽pipe我将它留给TDD和unit testing专家来回答。

出于同样的原因,你不会试图编写没有NUnit的unit testing。 模拟框架将帮助您validation数百个unit testing的状态和行为。 这是值得的2个星期左右的疼痛,以加快速度,真正帮助你专注于什么需要testing。

有一件令我困扰的嘲弄框架是“通过给定一个I / P应该怎样的function”

when(mock.someMethod(“some arg”))。thenReturn(“something”);

语句分布在许多unit testing类中。

让我以一个例子来阐述。 假设有一个DAO接口函数getEmp(int EmpID),它在传递一个Employee ID作为参数时返回一个Employee对象。 假设这个函数被10个不同的unit testing类嘲笑了。 现在,如果将来这个函数被更改为返回更新版本的Employee对象,则必须去10个不同的类中的每个类来更新这个更改。

缺点如下…

a)我不知道如何弄清所有模拟这个函数的类,以便我可以更新这个改变。

b)我现有的使用模拟DAO对象的testing用例仍然没有意识到DAO接口发生的变化,因为模拟没有改变,因此仍然是绿色的。 理想情况下,如果我自己编写了一个单独的模拟类并在任何地方使用它,我只需要更新一个更新版本的Employee对象。 而且,一旦我在这一个地方更新,我所有使用模拟的现有testing用例都将中断,然后我将知道到底需要去哪些位置,并为新的Employee对象进行更新。

对我的看法有任何想法..

关于嘲讽框架的好处之一是,它允许设定对被嘲笑的对象的期望。 随着期望,我可以设置各种条件来行使正在testing的代码。

隔离框架或模拟框架允许您testing所需的代码,而不依赖于它。 它使短期运行testing,让您快速debugging,并轻松地build立围绕代码的testing安全网。 不同的框架有不同的特点,如前所述 – 这是一个工具,你应该select正确的工具。

我用犀牛嘲笑模拟框架。 我和其他5个开发人员在一个8个月的大型企业应用程序上使用它。 我们在项目上使用了tdd。 它值得吗? 我猜。 有没有这样一个巨大的卖点,使用嘲笑,我必须在每个项目上使用它? 在我看来,没有。 这不是必要的,只是一个你可以使用的工具,如果你想尝试一下。 有些项目可以推出自己的模拟课程,就像这里说的那样,他们更喜欢 – 这很容易。 其他项目更大,可能需要一个嘲讽的框架。 关键词(在我看来)可能需要…您需要多less代码覆盖率? 对我来说,这是使用mock的另一个考虑因素。 我使用tdd / rhino mock所做的项目需要80%的代码覆盖率,所以mock帮助我们实现了这个目标。 如果我们的代码覆盖率要求较低,例如40%,那么我们可能不会使用一个嘲讽框架,而是像其他人提到的那样,自己写模拟类。