在为.Net选择模拟框架时,我应该考虑什么

时间:2009-03-13 13:11:14

标签: .net unit-testing tdd mocking

.Net有很多模拟框架。没有明显的赢家在各方面都取代了其他人。领先的模拟框架也有许多不同的样式用法。

学习所有模拟框架以确定使用哪个框架所花费的时间是不合理的。我不相信我们已经达到了一个阶段,我们可以谈论最好的模拟框架。那么在特定情况下,我应该问什么问题,关于项目和关于我自己,以帮助决定使用的最佳模拟框架?

了解您选择当前使用的模拟框架的原因以及您是否对此选择感到满意也很有用。

在比较模拟框架的样式时是否有一个有用的词汇表?

注意:我将这个问题限制在.Net,因为Java没有属性或lambda表达式,所以我希望模拟框架可以更好地用于.Net然后Java)

到目前为止

摘要:

  • 如果你需要模拟静态方法,或者 没有虚拟方法那么唯一 合理的选择是TypeMock,但它不是免费的,也不会促使你走向一个好的设计。
  • 如果你,
  • Rhino Mocks是一个非常好的选择 正在做TDD,例如你的对象 希望模拟实现接口。目前它似乎是“市场领导者”
  • 如果你是的话,应该考虑
  • Moqintroduction) 使用.NET 3.5 Moq 可以获得Rhino Mocks用于新项目

我从这个摘要中遗漏了什么?

那么,如果您使用的是.NET 3.5,是什么推动了Rhino MocksMoq之间的选择?


另见:

What should I consider when choosing a dependency injection framework for .NET?”也可能会引起关注,因为它会询问问题的“另一面”。

8 个答案:

答案 0 :(得分:21)

那么我应该通过询问项目和我自己来帮助决定在特定情况下使用的最佳模拟框架来提出什么问题?

您应该询问有关该项目的问题是:该项目是否是按照SOLID原则开发的?这是一个具有松散耦合和高内聚力的项目吗?在构建项目时是否使用了良好的OO原则?是否使用了依赖注入容器?系统是否采用按合同设计方法编码(彻底利用接口)?

如果对这些问题的回答是肯定的,那么你可以利用像RhinoMocks这样的模拟框架,这就是有些人称之为“自以为是”的框架。 RhinoMocks和其他一些模拟框架对于如何设计系统以便对象进行模拟具有非常强烈的意见。像RhinoMocks这样的框架希望您的项目以某种方式设计。当您以正确的方式构建代码时,使用RhinoMocks进行模拟肯定会轻松得多(没有密封类,没有静态,大量使用接口,虚拟类方法等)。

如果您对这些问题的回答是否定的,或者您正在使用具有大量高度耦合的类的遗留系统,那么您唯一的选择就是TypeMock,它可以嘲笑任何问题。

了解您选择当前使用的模拟框架的原因以及您是否仍然对此选择感到满意也很有用。

我之所以选择RhinoMocks,是因为当时(3年前),它显然是最成熟的模拟框架,功能最多。我一直坚持下去,因为它已经逐渐消失,使我的生活变得更加轻松(AutoMocking容器的出现是向效率迈进的巨大一步)。

除了功能集和易用性之外,我喜欢RhinoMocks的是它引导我在代码中实现更好的设计。我不是一个完美的程序员,我会在设计上犯错误。但是像RhinoMocks和NHibernate这样的工具可以帮助我指导一个更好的设计,因为当我犯错误并创造糟糕的设计时,这些工具会变得很痛苦。例如,如果你有一个糟糕的数据库设计,NHibernate很难处理。如果您的类设计很差,没有使用接口,没有使用IoC等,RhinoMocks会非常痛苦。

我喜欢RhinoMocks,因为它最终帮助我成为一个更好的开发人员,而不仅仅是因为我正在测试我的代码,而是因为我正在以更好的方式塑造我的代码 - 设计它。

答案 1 :(得分:14)

我更喜欢{3.5}项目的Moq。它使用简单,根据我的经验,它有助于产生清洁和清晰的单元测试。

没有技术原因可以解释为什么不能在同一个项目中使用多个模拟框架。当然,标准化很好,但有些测试可能会更好地适应某些框架。

答案 2 :(得分:10)

免责声明 - 我为Typemock

工作

我不同意“Typemock不会让你做好设计”。是你,开发人员驱动一个好的或坏的设计,而不是你使用的工具。获得完成工作的工具,让您高效,但良好设计的责任是您自己的。如果你认为在你的代码中包含所有类型的抽象,只是为了测试,那就去做吧,但你可能不会想出一个“好”的设计。它可能比你现在的设计更复杂。

答案 3 :(得分:9)

在为.Net

选择模拟框架时,我应该考虑什么

除了您正在测试的代码库的设计之外,还要考虑的另一个方面是使用模拟时测试的可读性。

在这方面,我正在投票给NSubstitute - 一个新的模拟框架,具有非常富有表现力的API(没有lambda)和与Moq和Rhino Mocks类似的功能。它最近已达到1.0版本。

一个用法示例(来自NSubstitute主页):

//Create:
var calculator = Substitute.For<ICalculator>();

//Set a return value:
calculator.Add(1, 2).Returns(3);
Assert.AreEqual(3, calculator.Add(1, 2));

//Check received calls:
calculator.Received().Add(1, Arg.Any<int>());
calculator.DidNotReceive().Add(2, 2);

//Raise events
calculator.PoweringUp += Raise.Event();

使用RhinoMocksMoq和NSubstitute进行的测试可读性的详细比较here

答案 4 :(得分:3)

stubs看起来很有趣,我认为它可能附带.NET V4。我不知道你需要使用它的开发者工作室的女巫版。目前您可以从上面的链接下载它。

  

Stubs是一个轻量级的框架   在.NET中测试存根和绕道   enterily基于代表,类型   安全,可重构和源代码   产生。 Stubs设计支持   Code Contracts运行时写入和   为Pex提供最小的开销   白盒分析。可以使用存根   在任何.NET方法,包括   密封的非虚拟/静态方法   类型。

(我已将此作为回答者发布,然后将其添加到问题中,因为我从未使用过Stabs,只花了几分钟看着它)

答案 5 :(得分:2)

RhinoMock几乎是.NET最先进的模拟框架。不能出错。如果你愿意的话,我猜你可以把它的“风格”视为“所有行业的杰克”。

来自web site

Rhino Mocks提供什么?

  • 明确记录&amp;重播模型的期望。
  • 自然安排,行动,断言语法
  • 支持.Net 2.0和.Net 3.5
  • 使用强类型模拟。
  • 设置方法操作,返回特定值或抛出异常。
  • 期望基于:
    • 匹配的参数
    • 约束匹配
    • 使用您自己的代码验证预期参数的自定义回调

答案 6 :(得分:0)

我会推荐FakeItEasy。它是一个非常具有描述性的模拟框架,可以非常轻松地读取和模拟接口。它有一个活跃的开源社区,效果很好。

答案 7 :(得分:0)

我使用 Telerik JustMock ,这是一个非常专业且易于模拟框架的好文档。