Moles与其他隔离框架有何不同,例如Moq,RhinoMocks等

nic*_*s13 2 .net mocking moles

就像上面说的那样.我想知道它是如何不同的.作为微软的产品,它是否与更常见的框架做类似的事情,但是使用新的名称,或略有不同; 只是显然难以实现...例如MsTest.

它有多成熟?生产准备好了吗?它意味着比Moq等更多(像MsTest不仅仅是一个单元测试框架).它是否覆盖了相同的嘲弄场地.它会做些更糟糕的事吗?更好?

我正在考虑看看它,但是在这些日子里有如此多的框架,我想知道它的好处是什么.

小智 5

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

Moles的缺点是它比使用像Moq或RhinoMocks这样的模拟框架要复杂一点.这一附加功能使Moles的学习曲线更加陡峭.此外,虽然您可以相当容易地将Moles与Moles接口并在CI构建中使用它,但是当您实际使用Moles时,您会"骚扰"并生成具有适当钩子的新程序集到新的.dll中.在较大的项目中,这可能会略微增加构建时间.最后,我遇到了一些让Moles在TFS构建和测试部署中工作的问题(但这可能只是我).

我不会真的把它变成"两种情况".我主要使用Moq满足我的大部分需求,并尝试使用传统框架编写我的代码以进行测试.但是,如果您遇到无法轻松隔离代码进行各种单元测试的情况,我会在这些情况下使用Moles.

最后,请阅读Martin Fowler的文章"Mocks Are not Stubs"(http://martinfowler.com/articles/mocksArentStubs.html).在我看来,这是你真正想要尝试使用模拟和存根的最佳描述.