Rhino Mock vs. TypeMock vs. NUnit Mocking?

时间:2009-09-04 13:23:04

标签: unit-testing nunit mocking rhino-mocks typemock

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

非常感谢任何信息!

4 个答案:

答案 0 :(得分:37)

TypeMock是一种商业产品(意味着你必须付钱),但它允许你模拟具体的对象 - 不像RhinoMocks / NUnit / MoQ,它只能模拟一个接口/抽象类。如何实现这一点是边缘黑魔术,但它使用CLR做了一些非常聪明的事情。

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

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

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

答案 1 :(得分:19)

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

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

@RichardOD,感谢提醒,他的书“The Art of Unit Testing”详细介绍了视频没有的内容。我拥有这本书,而且信息非常丰富。

答案 2 :(得分: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将这些限制归咎于碎片。据我所知,它主要用于试图获取代码的人,他们无法控制被测试。

答案 3 :(得分:2)

我一直使用TypeMock,并发现它是一个非常强大的工具,可以提高我的单元测试的覆盖率。这是因为我使用SharePoint,只有TypeMock可以允许我模拟SharePoint类 - 因为它们是具体的类而不是接口。

使用RhinoMock,Moq,NUNit等模拟SharePoint类是不可能的,因为(我相信)它们需要接口来模拟对象,而不是能够模拟实际的具体类。

如果你的代码确实使用了很多接口,并且你不需要模拟具体的类,那么TypeMock有点贵,但是对于你获得的功能,这是值得的。