代码之家  ›  专栏  ›  技术社区  ›  Dan Appleyard

RhinoMock vs.TypeMock vs.NUnit在嘲笑?

  •  19
  • Dan Appleyard  · 技术社区  · 15 年前

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

    任何信息都将不胜感激!

    4 回复  |  直到 15 年前
        1
  •  37
  •   Kirschstein    15 年前

    TypeMock是一种商业产品(意味着您必须为此付费),但它允许您模拟具体对象,而Rhinomock/NUnit/MoQ只能模拟接口/抽象类。它是如何做到这一点的是边缘黑魔法,但它用CLR做了一些非常聪明的事情。

    当您在项目中使用不使用许多接口的库时,这可能特别有用。例如,您可以使用TypeMock模拟LINQtoSQL数据上下文或Sharepoint对象。但是,如果您使用的是TypeMock,则 在应用程序中没有糟糕设计的借口 .

    据我所知,除了细微的语法差异外,大多数模拟框架都已经脱离了旧的记录/回放模型。通常,通过使用流畅的界面编写期望值来设置模拟。

    就个人而言,我只使用了最小起订量和I<3它。

        2
  •  19
  •   Dale Ragan    15 年前

    一个叫 TDD - Understanding Mock Objects

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

    @RichardOD,谢谢你的提醒,他的书“ The Art of Unit Testing “这本书是我自己的,内容非常丰富。

        3
  •  14
  •   George Mauer    15 年前
    • SetUpResultFor() 都是老办法。新方法是 mockObject.AssertWasCalled() .

    我没有任何与其他人的个人经验,但。。。

    • MOQ是一个开源的、不断开发和改进的框架,由业界产量稍低的开发人员之一(与Ayende相比)开发。它较新,因此缺少Rhino.Mocks所具有的一些功能。这通常不是一个问题,因为这些特性往往是Rhino中不推荐的特性。我听说正因为如此,学习起来稍微容易一些(顺便说一句,模仿框架并不难)。
    • 就模仿而言,努尼特模仿是非常古怪的。它不支持当前首选的Arrange-Act-Assert语法,而是依赖于Expect-Verify(record/replay)。它还依赖字符串来标识方法和属性名,而不是lambda。这使得它明显抵制重构。这是一个严重的问题。我不推荐。
    • TypeMock Isolater是一家公司(Roy Osherove所有)的薪酬模拟框架的核心。Roy Osherove知道自己的测试,但对于如何应用它也有一些温和的争议性意见。就其所能做的而言,这确实是非常激烈的——深入到底层并修改CLR对象的工作方式。然而,TypeMock背后的理念并不是100%的TDD。TDD的一部分好处是,通过接受模拟框架的限制,您将设计出更好的代码。TypeMock将这些限制炸成碎片。据我所知,它主要用于那些试图获取他们无法控制的测试代码的人。
        4
  •  2
  •   Tim Cooper    13 年前

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

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

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