2010-07-12 42 views
14

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

我的问题是:.Net是否有任何嘲讽框架可以做类似的事情?我正在寻找一些免费的东西,我不希望某些方法需要虚拟或抽象。

回答

10

微软研究院为此开发了Moles,这是Pex的一部分,但可以独立安装。它是免费的。网站上有一个很好的introductory article (pdf),它解释了如何模拟静态方法。他们需要一段时间才能找到你想要的东西(第16页,任务3)。

Here and here(Channel 9)你可以找到一个关于如何存根DateTime.Now的例子。使用鼹鼠,你可以嘲笑你想要的任何东西。

+0

有点晚对不起 – 2010-07-26 12:19:30

+0

不幸的是,它看起来像Visual Studio的最后一个版本,其中支持痣是Visual Studio 2010.在Visual Studio 2012+中,痣被替换为“Microsoft Fakes”显然需要其中一个企业级Visual Studio SKU。 – 2016-05-24 14:57:37

8

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

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

+0

您的权利,当你说它不便宜$ 451.00为一个许可证 – 2010-07-12 16:28:55

+0

感谢您的答案,但我需要的东西是免费的,这是不依赖于任何一种虚拟\抽象方法 – 2010-07-12 16:51:56

+1

我有相当不错的成功moq上一个大中型项目。 – Surya 2010-07-23 18:52:46

6

您可以使用类而不是MoqRhino.Mocks的接口,但嘲笑的方法必须是虚拟的。 Mark Rushakoff在TypeMock上的回答是正确的(+1)。

最好的选择是重构您的现有代码的可测试性(这可能需要时间)。我建议您阅读Michael Feathers的Working Effectively with Legacy Code

+0

感谢您指向我的书我总是喜欢一个建议 – 2010-07-12 16:37:23

1

很多.NET模拟框架使用Castle Dynamic Proxy在运行时创建模拟。因此,只允许接口/虚拟方法被模仿的限制来自Castle,我认为它源于CLR。 MOQRhinoMocks都可以模拟虚拟方法,这种虚拟方法非常好。

两个类和接口可以 代理,但是只有虚拟成员 可以被截获。

我的建议是开始为那些需要嘲笑的类创建抽象基础,并让具体的类扩展它。然后抽象基地可以被传递和嘲笑。这实际上是一个不太复杂的重构练习。