每个主要模拟框架的现实利弊是什么?

时间:2009-11-11 22:18:56

标签: c# .net mocking rhino-mocks moq

  

另见“What should I consider when choosing a mocking framework for .Net

我正在尝试决定在我最近开始使用的.NET项目上使用的模拟框架。我想加快对不同框架的研究。我最近阅读了这篇博客文章http://codevanced.net/post/Mocking-frameworks-comparison.aspx,并想知道是否有任何StackOverflow受众在实际优势和框架注意事项方面有任何补充。

人们是否可以列出他们目前正在使用或已经调查过自己在.NET项目中使用的模拟框架的优缺点。我认为这不仅有助于我决定当前的项目,还可以帮助其他人在为他们的情况选择正确的框架时做出更明智的决策。我不是任何框架的专家,但我想得到支持和反对我遇到的主要框架的论据:

  • RhinoMocks
  • 起订量
  • TypeMock Isolator
  • NMock
  • 摩尔

我错过了其他可用的替代品。我也喜欢那些由于问题而转换或停止使用产品的用户的见解。

7 个答案:

答案 0 :(得分:13)

我根本不认识Moles,但我会介绍一些我知道的(尽管如此我真的需要一张桌子)。

<强>起订量

赞成

  • 类型安全
  • 一致的界面
  • 鼓励良好的设计

缺点

  • 不像其竞争对手那样功能齐全
    • 它无法模拟代表
    • 无法做出有序的期望
    • 可能是我现在想不到的其他事情......
  • 只能模拟界面和虚拟/抽象成员

犀牛嘲笑

赞成

  • 类型安全
  • 完整功能集
  • 鼓励良好的设计

缺点

  • 令人困惑的API。有太多不同的方法可以做同样的事情,如果你以错误的方式将它们组合在一起它就行不通。
  • 只能模拟界面和虚拟/抽象成员

TypeMock Isolator

赞成

  • 类型安全(AFAIR)
  • 可以模拟任何

缺点

  • 非常侵略性
  • 潜在供应商锁定
  • 不鼓励良好的设计

<强> NMock

赞成

  • 鼓励良好的设计
  • 适用于任何版本的.NET(甚至1.1)

缺点

  • 非类型安全
  • 只能模拟界面和虚拟/抽象成员

请注意,特别是有关TypeMock的优点和缺点是极具争议性的。我发表了my own take on the matter on my blog

我开始使用NMock,这是2003年的唯一选择,然后由于其类型安全而迁移到Rhino Mocks,现在因为API更简单而使用Moq。

答案 1 :(得分:3)

到目前为止,我已经使用过RhinoMocks和Moq。 Moq目前是我最喜欢的,因为它的简单性是我目前所需要的。 RhinoMocks非常强大,但我从来没有能够充分利用它。

答案 2 :(得分:2)

我们已经使用Rhino Mocks一年多了。 PRO:

  • 轻松制作模拟
  • 可以模拟公共和内部方法
  • 可以模拟接口或类
  • 可以创建部分模拟(仅模拟类中的特定方法)

反对:

  • 方法必须至少是内部和虚拟的(可能会破坏您的架构)
  • 难以用于逐个属性的断言,特别是对于在测试范围内创建的对象集合 - 约束语法变得复杂
  • 录制停止并开始播放时必须小心
  • 小心嘲笑什么电话(比如你没看到的房产电话或非虚拟的方法) - 你可能得到的错误不是很有帮助

总的来说,我们发现使用模拟框架可以促进“白盒子”测试(特别是对于单元测试)。我们最终得到的测试证实了事情的完成情况,而不是他们在做什么。它们对重构毫无用处,我们不得不重写它们中的大多数。

答案 3 :(得分:2)

像弗兰克和克里斯一样,我尝试过RhinoMocks并切换到Moq。我没有失望。查看我的一系列博文:

编辑:请注意,我通常使用存根进行基于状态的测试;我很少用可验证的模拟进行行为测试。

答案 4 :(得分:1)

我没有使用过所有这些框架,但我查看了RhinoMocks和Moq,并选择了Moq,因为它感觉更优雅,更简单。我正在使用trunk版本,其中包含对最近4.0 beta版本中回调的4参数限制必须修复。

我特别喜欢默认的Moq行为,当进行意外调用时,它的行为不像严格的模拟对象失败测试。如果你愿意,你可以将它配置为执行此操作,但我发现这需要花费太多时间来设置期望而没有足够的时间进行测试。

答案 5 :(得分:1)

我使用TypeMock,因为我正在开发SharePoint。由于TypeMock可以模拟任何东西,因此在单元测试我们的SharePoint Web部件,事件接收器,工作流等时,它被证明是一种宝贵的资源。

在缺点方面,TypeMock可能很昂贵,但有一个version可用,这是特定于SharePoint的,并且成本低于完整的TypeMock包。我强烈推荐它。

我不同意的一点是,这种观念认为TypeMock不能让你很好地设计你的代码。我创建的类和整体代码通常设计得很好。仅仅因为我使用TypeMock并不意味着我牺牲了我的设计质量 - 我仍然在练习IoC和SRP。仅仅因为TypeMock可以模拟任何东西并不意味着我编写代码来反映这种能力。

答案 6 :(得分:0)

您可能需要记住,如果您需要支持多语言环境(例如VB),所有代码可配置框架(我可以直接与Moq和RhinoMocks对话)将会很痛苦(缺乏) )VB中的匿名委托/ lambda语法。这在Visual Studio 2010 / VB 10中更有可能,但仍然无法与漂亮的C#lambda语法相媲美。

TypeMock appears to have some support for VB

相关问题