【问题标题】:Mocking non-virtual Events (In COM interop classes)模拟非虚拟事件(在 COM 互操作类中)
【发布时间】:2009-04-22 18:24:43
【问题描述】:

编辑:语言/平台是 C# / .Net

我目前正试图填补我当前项目中的一个巨大的单元测试空白,并且诚然是 TDD 的新手,我发现自己对于如何开始测试一些更关键的业务功能感到很困惑。

我选择了 Moq,并且很轻松地进行了简单的模拟,但是在我的应用程序的核心是一个相当大的、可怕的 COM 互操作层,我很难概念化如何适当地进行单元测试。 COM 组件完全是第 3 方,因此无法修改,它实现了相当于处理电话呼叫的有限状态机。该组件通过一组非虚拟事件通知我的应用程序,我想以特定顺序对其进行测试以模拟状态更改,但是 Moq 不提供任何方法来为虚拟事件执行此操作。

所以我对知识渊博的 TDDers/Mockists 的问题是:你会如何测试这种东西?

显然 TypeMock 支持这一点(以换取它自己的缺点),但出于类型安全方面的各种原因以及我普遍认为它在我背后做一些狡猾的事情,我宁愿不使用它。

【问题讨论】:

    标签: tdd moq com-interop typemock


    【解决方案1】:

    你只能模拟虚拟/抽象方法,除非你使用像 TypeMock 这样的重型工具。

    当您必须测试您无法控制的代码时,您将不得不打破对该代码的依赖。创建一个具有不可测试类的方法、属性和事件的外观。坚持使用您实际使用的那些;它会减少您必须编写的代码的大小。针对您控制的外观而不是您不控制的代码编写代码。

    最后一件事是使用几种技术之一来访问允许您在测试期间替换模拟的外观。您可以使用配置文件、依赖注入框架、延迟实例化等。这样您就可以模拟出您的外观并将其用于单元测试。当然,您仍然需要进行一些集成测试,以确保您的外观与实际的 COM 互操作类正常工作。

    要获得一些灵感,请查看 System.Web.Abstractions。它包含许多包装 ASP.NET 核心类的类,以使它们可模拟。

    【讨论】:

    • 我真的很欣赏经过深思熟虑的回应,但似乎这仍然是问题的症结所在,因为在 COM 组件和某些抽象层之间总是存在无法测试的交互。也许我对 TDD 哲学的理解存在根本缺陷……
    • 不。你说得很对。但话又说回来,没有什么是完美的。
    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多