【问题标题】:How to mock unit testing without using any external dll? [closed]如何在不使用任何外部 dll 的情况下模拟单元测试? [关闭]
【发布时间】:2013-11-04 12:19:26
【问题描述】:

编辑:looking for a C# mocking framework that allows mocking static methods 这个问题没有为我的问题提供解决方案。

我无法免费为静态方法进行模拟单元测试(如果有,请提出建议)。

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

请提出一个解决方案,让我开始我的自定义模拟单元测试。

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

【问题讨论】:

  • 您的问题不清楚。你想嘲笑什么?为什么不能使用现有的模拟框架?
  • @DavidArno:使用现有框架(起订量)我能够模拟非静态方法。似乎模拟静态方法不是免费的。所以我想知道有什么方法可以让我自己自定义模拟测试来测试静态方法,或者是否有任何免费资源来模拟静态方法。
  • 试试 MS Moles。它已被新的 MS Fakes 取代,但您仍然可以使用它。看看文档。 research.microsoft.com/apps/mobile/showpage.aspx?page=/en-us/… 如果这不起作用,我会考虑使 API 可测试,例如创建可测试的包装器等。

标签: c# .net unit-testing mocking


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的链接。那些不是免费的。我明确提到我需要一个免费的。
  • @GrantWinney 所以,世界上没有免费提供静态方法测试的测试框架。是这样吗?
  • @Ebenezar 已更新答案以解决您对免费解决方案的要求。
  • @DavidArno 感谢您的链接。我想我可以从这些开始。
【解决方案2】:

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

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

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

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

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

[编辑] 覆盖静态方法内容的唯一方法是使用 IL 注入。 这是一种非常讨厌的做法,但很有效(不过,仅将其用于测试......这是在破解 CLR!)。

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

【讨论】:

  • 无法使用 rhino 模拟来模拟静态方法。
  • 查看我对静态方法的编辑。
【解决方案3】:

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

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

看下面的例子: http://www.unit-testing.net/CurrentArticle/How-To-Remove-Data-Dependencies-In-Unit-Tests.html

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多