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

另请参阅“ 为.Net选择模拟框架时应该考虑什么 ”

我正在尝试决定在我最近开始使用的.NET项目上使用的模拟框架。 我想加快我对不同框架的研究。 我最近阅读了这篇博客文章http://codevanced.net/post/Mocking-frameworks-comparison.aspx,并想知道是否有任何StackOverflow受众有任何可以添加的东西,以实现现实世界的优势和对框架的警告。

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

  • RhinoMocks
  • 起订量
  • TypeMock隔离器
  • NMock

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

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

起订量

优点

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

缺点

  • 并不像其竞争对手那样function齐全
    • 它无法模仿代表
    • 它不能做有序的期望
    • 可能还有其他我现在想不到的东西……
  • 只能模拟接口和虚拟/抽象成员

犀牛嘲笑

优点

  • 类型安全
  • 全function集
  • 鼓励良好的设计

缺点

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

TypeMock隔离器

优点

  • 类型安全(AFAIR)
  • 可以嘲笑任何事

缺点

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

NMock

优点

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

缺点

  • 不是类型安全的
  • 只能模拟接口和虚拟/抽象成员

请注意,特别是关于TypeMock的优点和缺点是极具争议性的。 我在博客上发表了自己对此事的看法 。

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

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

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

  • 容易创造嘲笑
  • 可以模拟公共和内部方法
  • 可以模拟接口或类
  • 可以创建部分模拟(仅模拟类中的特定方法)

反对:

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

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

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

  • 犀牛嘲笑的问题
  • 模拟:下一代
  • 模拟:下一代II
  • 切换到Moq

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

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

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

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

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

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

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

TypeMock似乎对VB有一些支持