.net - 为 .Net 选择模拟框架时应该考虑什么

标签 .net unit-testing tdd mocking

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

去年关闭。




Improve this question




.Net 有很多模拟框架。没有明确的赢家在各个方面都取代了其他人。领先的模拟框架也有许多不同的使用风格。

学习所有模拟框架以决定使用哪个框架所花费的时间是不合理的。我不相信我们还没有达到可以谈论最好的模拟框架的阶段。那么我应该问关于项目和我自己的哪些问题,以帮助决定在特定情况下使用的最佳模拟框架?

了解您选择当前正在使用的模拟框架的原因以及您是否仍然对该选择感到满意也很有用。

在比较模拟框架的风格时,是否有有用的词汇可供使用?

( 注意: 我将这个问题限制在 .Net 中,因为 Java 没有属性或 lambda 表达式,所以我希望模拟框架对于 .Net 比 Java 更好)

到目前为止的总结:

  • 如果您需要模拟静态方法,或者
    没有虚拟方法,然后是唯一的
    合理的选择是TypeMock ,但是它不是免费的,也不会驱使你走向一个好的设计。
  • Rhino Mocks如果你是一个很好的选择
    正在做 TDD,例如你的对象
    希望模拟实现接口(interface)。目前看来是“市场龙头”
  • Moq ( introduction ) 如果您是
    使用 .NET 3.5 Moq 可能会在 Rhino Mocks 上获得新项目

  • 我从这个总结中遗漏了什么?

    那么是什么插入了 Rhino Mocks 之间的选择?和 Moq ,如果您使用的是 .NET 3.5?

    也可以看看:
  • What C# mocking framework to use?
  • What are the capabilities of Moq and Rhino.mocks?
  • What are the real-world pros and cons of each of the major mocking frameworks?

  • What should I consider when choosing a dependency injection framework for .NET? ”也可能是有趣的,因为它问的是问题的“另一面”。

    最佳答案

    那么我应该通过询问项目和我自己的哪些问题来帮助决定在给定案例中使用的最佳模拟框架?

    关于该项目,您应该问的问题是:该项目是否是根据 SOLID 原则开发的?这是一个松耦合、高内聚的项目吗?在构建项目时是否使用了良好的 OO 原则?是否使用了依赖注入(inject)容器?系统是否以按契约(Contract)设计的方法进行编码(彻底利用接口(interface))?

    如果您对这些问题的回答是肯定的,那么您可以使用像 RhinoMocks 这样的模拟框架,这就是某些人所说的“自以为是”的框架。 RhinoMocks 和其他一些模拟框架对于如何设计系统以便模拟对象有非常强烈的意见。像 RhinoMocks 这样的框架希望您的项目以某种方式设计。当您以正确的方式构建代码(没有密封类、没有静态、大量使用接口(interface)、类上的虚拟方法等)时,使用 RhinoMocks 进行模拟肯定会容易得多

    如果您对这些问题的回答是否定的,或者如果您正在处理具有许多高度耦合类的遗留系统,那么您唯一的选择就是 TypeMock,它可以模拟任何东西。

    了解您选择当前使用的模拟框架的原因以及您是否仍然对这个选择感到满意也很有用。

    我之所以选择 RhinoMocks,是因为当时(3 年多以前)它显然是最成熟、功能最多的模拟框架。我一直使用它,因为它已经进化了,这让我的生活变得更加轻松(AutoMocking 容器的出现是朝着效率迈出的一大步)。

    除了功能集和易用性之外,我喜欢 RhinoMocks 的地方在于它引导我在代码中进行更好的设计。我不是一个完美的程序员,我会在设计上犯错误。但是像 RhinoMocks 和 NHibernate 这样的工具可以帮助我做出更好的设计,因为当我确实犯了错误并创建了糟糕的设计时,使用这些工具会变得很痛苦。例如,如果您有一个糟糕的数据库设计,那么使用 NHibernate 会很痛苦。如果你有一个糟糕的类设计,不使用接口(interface),不使用 IoC 等等,使用 RhinoMocks 会非常痛苦。

    我喜欢 RhinoMocks 因为它最终帮助我成为一个更好的开发人员,不仅仅是因为我正在测试我的代码,还因为我正在以更好的方式塑造我的代码——设计它。

    关于.net - 为 .Net 选择模拟框架时应该考虑什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/642620/

    相关文章:

    c# - int 数据类型的服务器端验证

    .net - 您能否将一段代码标记为仅包含在调试版本中?

    c# - Keys.Shift 和 Keys.ShiftKey 的区别

    .net - Azure AD Microsoft 帐户客户端是公共(public)的,因此不应显示 'client_assertion' 和 'client_secret'

    c# - 如何用最小起订量 stub 抽象集合?

    java - android本地测试的数据文件

    java - 如何模拟注入(inject)属性文件值的字符串值?

    c# - 有什么方法可以模拟结构以在单元测试下获取类?

    design-patterns - 嵌入式系统的设计/实现模式

    ruby-on-rails - 如何测试 Ruby on Rails 功能测试的 JSON 结果?