【问题标题】:Is there a .NET/C# mocking framework that doesn't require virtual methods是否有不需要虚拟方法的 .NET/C# 模拟框架
【发布时间】:2014-01-16 17:41:13
【问题描述】:

我正在尝试使用 Visual Studio 2013 的内置工具对 .NET Web 项目进行单元测试。我已经使用 NuGet 添加了 Moq,但是如果不使用虚拟方法和/或接口重写整个项目,就无法测试控制器。所以我正在寻找一种方法来测试代码,而不用在现有的源代码中捣乱。

提前感谢您的帮助

【问题讨论】:

  • 嗨!如果你不能重写代码,也许你不能进行正确的单元测试——不过我可能是错的。 也许 自动探索测试在这种情况下可能有用。您可以将 Selenium 与 Firefox / IE / Chrome 驱动程序一起使用。如果您选择这样做,您可以在代码中定义一些 UI 测试场景并...运行它们。顺便说一句,你为什么要测试网络控制器?只是问......不过,您可以测试它们所依赖的模块。通常,网络控制器是虚拟的和懒惰的,它们将传入的请求委托给其他更努力的模块:)
  • 我不得不模拟控制器,因为它的构造函数依赖于我不想以任何方式改变的存储库(所以我模拟了) - 我想我可以返回并重构所有存储库以扩展接口,但我希望避免这种情况。我不想破坏任何东西
  • 那么...只需将dynamic object :) 或ExpandoObject 传递给控制器​​。也许你可以这样欺骗他(它)。然后 DynamicObject 将充当假存储库。你怎么看待这件事?哎呀,现在我才意识到:(这行不通,对不起...
  • And... 作为最后的手段... 定义一个与您的存储库具有相同名称的虚拟类,相同的方法签名等,并在这里和那里添加一些编译标志。当您想要测试时,那些编译标志将“注释掉”真正的实现并使用虚拟实现。不过,这是一个非常糟糕的解决方案。
  • 'Refactor / Extract Interface ...' 现在在 Visual Studio 中非常简单,并且它内置在 IDE 中。您需要创建多少个接口?

标签: c# unit-testing moq virtual


【解决方案1】:

由于您使用的是 VS2013,因此您可以利用 Microsoft Fakes and Shims。更多详情和使用方法http://msdn.microsoft.com/en-us/library/hh549175.aspx

【讨论】:

  • 我猜只有终极版才有这个功能
  • Per visualstudio.com/products/compare-visual-studio-products-vs 它适用于 Ultimate 和 Premium(无论是什么版本)版本
  • 我认为 Fakes 框架中的 Shims 是您的选择(显然,如果您拥有正确的许可证),但将 Shims 用于您拥有的代码并不是一个好习惯。我建议您最终更改代码以使用接口/虚拟方法。
【解决方案2】:

也许可以看看 FakeItEasy:http://fakeiteasy.github.io/

【讨论】:

  • 感谢您的想法;遗憾的是,FakeItEasy 还要求一切都是虚拟的或从接口扩展。
  • @eggshell 好的,那么对不起。我实际上并没有使用它,但前几天正在阅读它。
【解决方案3】:

目前能够进行“提升”模拟的三个库是:

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2016-09-28
    相关资源
    最近更新 更多