RhinoMock vs. TypeMock vs. NUnit的Mocking?

Dan*_*ard 19 nunit unit-testing rhino-mocks typemock mocking

我刚开始做测试驱动开发,我想知道RhinoMock,TypeMock和NUnit的内置模拟之间的主要区别?

任何信息将不胜感激!

Kir*_*ein 37

TypeMock是一个商业产品(意味着你将不得不为此付费),但允许你模拟具体的对象 - 不像RhinoMocks/NUnit/MoQ,它只能模拟一个接口/抽象类.如何实现这一点是临界黑魔法,但它使用CLR做了一些非常聪明的事情.

当您在项目中使用不使用许多接口的库时,这可能特别有用.例如,您可以使用TypeMock模拟LINQtoSQL datacontext或Sharepoint对象.但是,如果您使用TypeMock,这不是您的应用程序中的错误设计的借口.

据我所知,除了较小的语法差异外,大多数模拟框架已经远离旧的记录/回放模型.通常,您通过使用Fluent界面编写期望来设置模拟.

就个人而言,我只使用过MoQ而我<3.

  • 静态和密封类并不总是一个糟糕的设计,但不可能使用RhinoMocks/NUnit/MoQ来模拟它们.您是否放弃了整个功能集,只是因为您的工具不支持它? (2认同)
  • 啊,不.我有一些TON类不应该是用户可扩展的,因此它们不是虚拟/密封的.并猜测是什么 - 我经常需要模拟其中一个字段,以便我需要显示该类的特定行为.开封它们并不好 - 框架"依赖"它们不被扩展. (2认同)

Dal*_*gan 19

一个名为TDD的视频- 了解 Roy Osherove的模拟对象非常有助于学习不同模拟库的差异.他没有详细介绍每个方面,但足以让你理解.我希望这有帮助.Roy也是TypeMock的首席架构师,在单元测试领域是一位非常有影响力的人物.我不能推荐这个视频,对于那些想要学习如何使用模拟并了解库的可用性的人来说.

TypeMock和开源库之间的主要区别在于TypeMock使用Microsoft提供的Profiler API而不是动态代理.这允许TypeMock模拟具体类和静态方法.如果您不确定分析器是什么,它与JetBrain的dotTrace和RedGate的Ants .Net分析器等工具使用的API相同.TypeMock只是以不同的方式使用API​​伪造(模拟)你告诉它的内容.

@RichardOD,感谢提醒,他的书" 单元测试的艺术 "详细介绍了视频没有的地方.我拥有这本书,它非常有用.


Geo*_*uer 14

  • Rhino.Mocks是一个开源的,由业界最多产的开发人员之一不断开发和改进的框架.它已经存在了一段时间,因此支持了很多不同的模拟范例.因此,从某种意义上说,您可能会找到"旧"做事方式的教程,这可能会有点困难.这是一个提示, SetUpResultFor()Expect.Call()是旧的做事方式.新方法是mockObject.AssertWasCalled().

我没有与这些人有任何亲身经历,但......

  • MOQ是一个开源的,不断发展和改进的框架,由业界一个不那么多产的开发人员(与Ayende相比).它更新,因此缺少Rhino.Mocks的一些功能.这通常不是问题,因为这些功能往往是在Rhino中稍微弃用的功能.我听说过,因为这样学习起来稍微容易一些(模仿框架并不难学习).
  • 就嘲讽而言,NUnit Mocks非常古怪.它不支持当前首选的Arrange-Act-Assert语法,而是依赖于Expect-Verify(记录/重放).它还依赖于字符串来识别方法和属性名称而不是lambdas.这使其显着抵抗重构.这是一个严重的问题.我不推荐它.
  • TypeMock Isolater是一家公司的核心付费模拟框架(由?拥有?)Roy Osherove--一个了解他的测试的人,但对于如何应用它也有一些有争议的意见.它的功能非常强烈 - 降低到低级别并修改CLR对象的工作方式.然而,TypeMock背后的哲学并不是真正的100%TDD.TDD的部分好处是,通过接受Mocking框架的限制,您将设计出更好的代码.TypeMock将这些限制归咎于碎片.据我所知,它主要用于试图获取代码的人,他们无法控制被测试.

  • downvote不是来自我,但我不同意"接受Mocking框架的限制,你将设计更好的代码".我的意思是,你认真吗?假设我想遵循"信息隐藏"原则并完全封装非公共帮助程序类.那些有限的嘲弄工具不允许我这样做!如何暴露助手类并减少封装将导致更好的代码? (2认同)
  • 关于艾恩德没问题,我只是好奇.我很高兴看到你不要盲目跟随别人.但是你应该对这些限制在模拟工具中的后果更加开放.当开发人员创建一个单独的接口或仅为了单元测试而声明虚拟方法时,他通过添加不必要的,毫无意义的复杂性来对项目造成损害.一个好的嘲弄工具永远不应该强迫它.试图"强迫"开发人员进入优秀的OO根本不起作用,因为坏的人总是会绕过它. (2认同)
  • 哇,一个以民事方式结束的互联网论点?检查天空!这是天的结束吗?我会跟进另一个帖子,但是因为我很好奇,所以我会快速提问.TDD的过程也对发展施加了某些限制.我认为这些限制是关于TDD的一个方面,它可以帮助人们学习如何创建好的设计.你同意吗?如果是这样,那么你同意限制可以帮助你学习 - 你是否认为Rhino Mocks所施加的限制是错误的? (2认同)