如何在不使用任何外部DLL的情况下模拟单元测试?

时间:2013-11-04 12:19:27

标签: c# .net unit-testing mocking

编辑:looking for a C# mocking framework that allows mocking static methods此问题不能解决我的问题。

我无法在免费的情况下对静态方法进行模拟单元测试(请建议是否有)。

有没有办法可以自定义模拟测试而无需任何外部dll使用。

请建议一个解决方案让我开始定制模拟单元测试。

即使是教程链接也会有很大的帮助。

3 个答案:

答案 0 :(得分:4)

现有的框架允许模拟静态方法:looking for a C# mocking framework that allows mocking static methods

话虽如此,如果您想要模拟自己的代码,请遵循以下简单的经验法则:不要编写具有副作用的静态方法。这样,您的静态方法将不需要模拟,并且可以使用现有框架轻松模拟具有副作用的方法(通常需要模拟)。

如果您必须模拟静态并且您不想为现有框架付费,那么您需要编写自己的框架。一种方法是使用PostSharp(http://www.postsharp.net)之类的东西,它支持修改方法的静态行为,包括方法拦截。阅读http://www.postsharp.net/aspects/method-decorator以获取更多信息。有一个免费版本的PostSharp可用,但您必须检查许可证详细信息,看看它们是否适用于您的情况。

答案 1 :(得分:1)

不确定为什么你不想使用现有的模拟框架(它们有很多免费的库,如Rhino mocks

但是,您可以使用Reflection.Emit实现自己的模拟。

Here is一个关于如何在运行时发出动态类型的好教程(你可以动态地实现一个系统调用事件的接口来获取你的方法结果)。

这是一种创建拦截代理的方法(可用于模拟接口,但Reflection.Emit的应用领域要宽得多)

这是.Net框架的一部分。不需要第三方库。

<强> [编辑] 覆盖静态方法内容的唯一方法是使用IL注入。 这是一个非常讨厌的做法,但效率很高(虽然只是用于测试......那就是攻击CLR!)。

请参阅this link以了解有关它的更多信息。 这允许用另一个方法替换方法的IL(或手动修补它)。

答案 2 :(得分:0)

如果你想在不使用框架的情况下模拟静态方法,你可以考虑一种通过被测试类中的虚方法抽象静态方法的技术。

这个想法是你可以通过存根或测试类本身覆盖虚方法。

请看以下示例: http://www.unit-testing.net/CurrentArticle/How-To-Remove-Data-Dependencies-In-Unit-Tests.html