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

我是嘲笑的新手,所以我可能在这里完全错了,但我相信大多数模拟框架都依赖于接口。 不幸的是,我们的大部分代码都没有使用接口。 前几天,我在Java中看到了一个Mocking框架,它重现了类\ object的字节代码,而不是调用它的内部方法,但你仍然可以测试它是否正在调用这些方法。

我的问题是:.Net有没有可以做类似事情的模拟框架? 我正在寻找一些免费的东西,我不想要一些需要虚拟或抽象方法的东西。

Microsoft Research为此开发了Moles ,它是Pex的一部分,但可以独立安装。 它是免费的。 网站上有一篇很好的介绍性文章(pdf) ,解释了如何模拟静态方法。 它们需要一些时间才能找到你想要的东西(第16页,任务3)。

这里和这里 (第9频道)你可以找到一个关于如何存根DateTime.Now的例子。 使用Moles,您可以模拟任何您想要的东西。

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

但是大多数模拟框架并不完全依赖于接口; 他们也应该能够处理具体的类,尽管他们只能覆盖虚拟或抽象方法。

您可以使用类而不是Moq和Rhino.Mocks的接口,但模拟的方法必须是虚拟的。 Mark Rushakoff对TypeMock的回答是正确的(+1)。

最好的选择是重构现有代码以实现可测试性(这可能需要一些时间)。 我建议阅读Michael Feathers的“有效使用遗留代码” 。

许多.NET模拟框架使用Castle Dynamic Proxy在运行时创建模拟。 因此,仅允许模拟接口/虚拟方法的限制来自Castle,我认为其根植于CLR。 MOQ和RhinoMocks都能够模拟虚拟方法,这种方法尽可能好。

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

我的建议是开始为那些需要模拟的类创建抽象基础,并让具体的类扩展它。 然后可以传递抽象基础并进行模拟。 这真的是一个不太复杂的重构练习。