【问题标题】:How does Moles differ from other isolation frameworks, such as Moq, RhinoMocks etcMoles 与其他隔离框架有何不同,例如 Moq、RhinoMocks 等
【发布时间】:2025-11-29 20:05:01
【问题描述】:

和上面说的差不多。我想知道它有什么不同。作为 Microsoft 的产品,它是否与更常见的框架做类似的事情,但使用了新名称,或者略有不同;只是显然使困难......例如女士测试。

它有多成熟?生产就绪?它的目的不仅仅是 Moq 等(就像 MsTest 不仅仅是一个单元测试框架)。它是否涵盖相同的模拟场地。它会做一些更糟糕的事情吗?更好?

我正在考虑看看它,但是现在有这么多框架,我想知道它有什么好处。

【问题讨论】:

    标签: .net mocking moles


    【解决方案1】:

    模拟框架和隔离框架实际上是两个相似但不同的东西。模拟和存根框架通常是引用库,允许您创建接口的存根实现(以伪造行为)或模拟(以验证调用行为)。隔离框架通常在 CLR 中工作,并允许您检测到几乎任何您想要的代码区域(您自己的其他代码区域)。 Moles(它是 Pex 的一部分)是一个隔离框架,仍在 Microsoft 的研究部门 (http://research.microsoft.com/en-us/projects/pex/)。使用 Moles,您几乎可以隔离代码的任何部分(或 CLR 中的任何代码)并控制其行为方式。例如,使用 Moles,您可以拦截 DateTime.Now() 并返回设置的日期和时间以用于测试与日期相关的计算。当您拥有无法控制的黑盒第三方库时,它也很有用。

    Moles 的缺点是它比使用 Moq 或 RhinoMocks 等模拟框架要复杂一些。这一新增功能使 Moles 的学习曲线更加陡峭。此外,虽然您可以相当轻松地存根与 Moles 的接口并在 CI 构建中使用它,但当您实际检测到 Moles 时,您“mole”并生成一个新的程序集,其中包含正确的钩子到新的 .dll 中。在较大的项目中,这可能会稍微增加构建时间。最后,让 Moles 在 TFS 构建和测试部署中工作时遇到了一些问题(但可能只是我自己)。

    我不会真的把这变成一个“非此即彼”的情况。我将主要使用 Moq 来满足我的大部分需求,并尝试编写我的代码以使用传统框架进行测试。但是,如果您陷入无法轻松隔离代码以进行各种单元测试的情况,我会在这些情况下使用 Moles。

    最后,阅读 Martin Fowler 的文章“Mocks Aren't Stubs”(http://martinfowler.com/articles/mocksArentStubs.html)。在我看来,这是对你真正想尝试用 mocking 和 stubbing 做什么的最好描述。

    【讨论】:

    • 谢谢。我读过那篇文章很多次了,虽然它没有专门讨论替换 CLR 的想法。似乎应该有很好的理由来打破核心功能。
    最近更新 更多