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

C# 如何在不使用任何外部dll的情况下模拟单元测试?,c#,.net,unit-testing,mocking,C#,.net,Unit Testing,Mocking,编辑:这个问题不能解决我的问题 我无法免费对静态方法进行模拟单元测试(如果有的话,请建议) 有没有什么方法可以在不使用任何外部dll的情况下自定义模拟测试 请建议一个解决方案,让我开始定制模拟单元测试 即使是教程链接也会有很大帮助。不知道为什么不想使用现有的模拟框架(它们有很多类似的免费lib) 但是,您可以使用Reflection.Emit实现自己的模拟 关于如何在运行时发出动态类型的一个很好的教程(例如,您可以动态实现一个接口,该接口系统地调用一个事件以获得您的方法结果) 这是一种创建拦截代

编辑:这个问题不能解决我的问题

我无法免费对静态方法进行模拟单元测试(如果有的话,请建议)

有没有什么方法可以在不使用任何外部dll的情况下自定义模拟测试

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


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

不知道为什么不想使用现有的模拟框架(它们有很多类似的免费lib)

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

关于如何在运行时发出动态类型的一个很好的教程(例如,您可以动态实现一个接口,该接口系统地调用一个事件以获得您的方法结果)

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

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

[编辑] 重写静态方法内容的唯一方法是使用IL注入。 这是一个相当讨厌的做法,但效率很高(不过,只在测试中使用它……这是对CLR的攻击!)

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

不确定为什么不想使用现有的模拟框架(它们有大量类似于自由库的库)

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

关于如何在运行时发出动态类型的一个很好的教程(例如,您可以动态实现一个接口,该接口系统地调用一个事件以获得您的方法结果)

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

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

[编辑] 重写静态方法内容的唯一方法是使用IL注入。 这是一个相当讨厌的做法,但效率很高(不过,只在测试中使用它……这是对CLR的攻击!)

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

现有框架允许模拟静态方法:

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


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

现有的框架允许模拟静态方法:

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


如果您必须模拟静态,并且不想为现有框架付费,那么您需要编写自己的框架。一种方法是使用类似PostSharp()的东西,它支持修改方法的静态行为,包括方法拦截。阅读以了解更多信息。有一个免费的PASSCAP版本可用,但是你必须检查许可证细节,看看它们是否适用于你的情况。

< P>如果你想模拟静态方法而不使用框架,你可以考虑一种技术,通过在被测试的类中的虚拟方法来抽象静态方法。 其思想是,您可以通过存根或测试类本身重写虚拟方法

请看以下示例:
如果你想在不使用框架的情况下模拟静态方法,你可以考虑一种技术,通过在被测试的类中使用虚拟方法来抽象静态方法。 其思想是,您可以通过存根或测试类本身重写虚拟方法

请看以下示例:

您的问题不清楚。你想嘲笑什么?为什么不能使用现有的模拟框架?@DavidArno:使用现有框架(moq),我可以模拟非静态方法。模仿静态方法似乎不是免费的。所以我想知道有什么方法可以让我自己定制模拟测试来测试静态方法,或者有没有免费的资源来模拟静态方法。它被新的MS Fakes取代,但您仍然可以使用它。请看一下文档。如果这不起作用,我会考虑让API可测试,比如创建可测试的包装等。你的问题不清楚。你想嘲笑什么?为什么不能使用现有的模拟框架?@DavidArno:使用现有框架(moq),我可以模拟非静态方法。模仿静态方法似乎不是免费的。所以我想知道有什么方法可以让我自己定制模拟测试来测试静态方法,或者有没有免费的资源来模拟静态方法。它被新的MS Fakes取代,但您仍然可以使用它。请看一下文档。如果这不起作用,我会考虑使API可测试,例如创建可测试的包装等。无法使用rhino mocks模拟静态方法。请参阅我对静态方法的编辑。无法使用rhino mocks模拟静态方法。请参阅