非接口依赖的C#模拟框架

15

我对模拟测试很陌生,所以我的理解可能有误,但我认为大多数模拟框架都依赖于接口。不幸的是,我们大部分代码并没有使用接口。前几天我看到了一个Java的模拟框架,它可以重现一个类\对象的字节码,以避免调用其内部方法,但您仍然可以测试它是否调用了这些方法。

我的问题是:.Net是否有任何可以做类似事情的模拟框架? 我正在寻找一些免费的东西,并且不想要那些要求方法必须是虚方法或抽象方法的框架。

4个回答

10
Microsoft Research已经为此开发了Moles,它是Pex的一部分,但可以独立安装。而且它是免费的。网站上有一篇很好的介绍性文章(pdf),解释了如何模拟静态方法。在进入你想要的内容之前需要一些时间(第16页,任务3)。 这里这里(Channel 9)你可以找到一个关于如何存根DateTime.Now的示例。使用Moles,你可以模拟任何你想要的东西。

不幸的是,最后一个支持Moles的Visual Studio版本是Visual Studio 2010。在Visual Studio 2012+中,Moles被"Microsoft Fakes"所取代,显然需要其中一个企业级别的Visual Studio SKUs。 - Jon Schneider

8

TypeMock Isolator可以模拟任何.NET类,但它不是免费的(甚至不便宜)。我不确定它的工作原理,但它可以实现相同的最终结果。

但大多数模拟框架并不仅依赖于接口;它们应该能够像处理接口一样处理具体类,尽管它们只能覆盖虚拟或抽象方法。


你说它不便宜,你是对的,一张单独的许可证需要451美元。 - Chris G
谢谢您的回答,但我需要一些免费的东西,并且不依赖于任何虚拟或抽象方法。 - Chris G

6
你可以在MoqRhino.Mocks中使用类代替接口,但是被模拟的方法必须是虚拟的。Mark Rushakoff在TypeMock上的回答是正确的(+1)。
最好的选择是重构你现有的代码以实现可测试性(可能需要时间)。我建议阅读Michael Feathers的Working Effectively with Legacy Code

谢谢你向我推荐这本书,我总是喜欢有推荐。 - Chris G

1
很多.NET模拟框架使用Castle Dynamic Proxy在运行时创建模拟。因此,只允许模拟接口/虚方法的限制来自于Castle,我认为这是根植于CLR中的。MOQRhinoMocks都能够模拟虚方法,这已经足够好了。

类和接口都可以被代理,但只有虚成员可以被拦截。

我的建议是为那些需要被模拟的类创建抽象基类,并使具体类扩展它。然后可以传递抽象基类并进行模拟。这确实是一个不过于复杂的重构练习。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接