编辑:寻找允许模拟静态方法的 C# 模拟框架这个问题没有为我的问题提供解决方案。
我无法免费为静态方法进行模拟单元测试(如果有,请提出建议)。
有什么方法可以在不使用任何外部 dll 的情况下自定义模拟测试。
请提出一个解决方案,让我开始我的定制模拟单元测试。
即使是教程链接也会有很大帮助。
编辑:寻找允许模拟静态方法的 C# 模拟框架这个问题没有为我的问题提供解决方案。
我无法免费为静态方法进行模拟单元测试(如果有,请提出建议)。
有什么方法可以在不使用任何外部 dll 的情况下自定义模拟测试。
请提出一个解决方案,让我开始我的定制模拟单元测试。
即使是教程链接也会有很大帮助。
有允许模拟静态方法的现有框架:寻找允许模拟静态方法的 C# 模拟框架
话虽如此,如果要模拟的是您自己的代码,请遵循这个简单的经验法则:不要编写具有副作用的静态方法。这样,您的静态方法将不需要模拟,并且可以使用现有框架轻松模拟具有副作用的方法(通常确实需要模拟)。
如果您必须模拟静态并且您不想为现有框架付费,那么您需要编写自己的。一种方法是使用 PostSharp ( http://www.postsharp.net ) 之类的东西,它支持修改方法的静态行为,包括方法拦截。阅读http://www.postsharp.net/aspects/method-decorator了解更多信息。有一个免费版本的 PostSharp 可用,但您必须检查许可证详细信息以查看它们是否适用于您的情况。
不知道你为什么不想使用现有的模拟框架(它们有很多免费的库,比如Rhino模拟)
但是,您可以使用 Reflection.Emit 实现自己的模拟。
这是一个关于如何在运行时发出动态类型的好教程(例如,您可以动态实现一个接口,该接口系统地调用事件以获取您的方法结果)。
这是一种创建拦截代理的方式(可以用来模拟接口,但Reflection.Emit的应用领域要广泛得多)
这是 .Net 框架的一部分。不需要第三方库。
[编辑] 覆盖静态方法内容的唯一方法是使用 IL 注入。这是一种非常讨厌的做法,但很有效(尽管只将它用于测试......那是在破解 CLR!)。
请参阅此链接以了解更多信息。这允许用另一个方法替换一个方法的 IL(或手动修补它)。
如果您想在不使用框架的情况下模拟静态方法,您可以考虑一种技术,通过被测类中的虚拟方法抽象静态方法。
这个想法是您可以通过存根或测试类本身覆盖虚拟方法。
看下面的例子: http ://www.unit-testing.net/CurrentArticle/How-To-Remove-Data-Dependencies-In-Unit-Tests.html