4

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

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

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

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

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

4

1 回答 1

4

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

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

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

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

于 2009-04-22T18:37:13.930 回答