tdd - 模拟非虚拟事件(在 COM 互操作类中)

标签 tdd moq com-interop typemock

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

我目前正在尝试填补当前项目中巨大的单元测试空白,并且确实是 TDD 的新手,发现自己对如何测试一些更关键的业务功能感到非常困惑。

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

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

显然 TypeMock 支持这一点(以换取它自身的缺点),但出于类型安全方面的各种原因,我宁愿不使用它,而且我总感觉它在背后做一些不正当的事情。

最佳答案

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

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

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

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

关于tdd - 模拟非虚拟事件(在 COM 互操作类中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778546/

相关文章:

architecture - 在应用程序服务中进行验证来检查 DTO 的 id 是否有效或者 dto 的属性之一是否为空是一种不好的做法吗?

c# - 从托管 .NET 代码调用 native 回调(使用 COM 加载托管代码时)

.net - "Register for COM Interop"与 "Make assembly COM visible"

python - 在python中模拟文件对象或iterables

tdd - 模拟成员(member)

tdd - 使用 TDD 变得更容易需要多长时间?

c# - 使用 Moq 验证具有正确命令参数的 CommandHandler 方法调用

unit-testing - 什么是严格和非严格模拟?

c# - 模拟由您正在单元测试的函数调用的函数。使用起订量

c++ - COM 代码库位置 - 如何选择要使用的版本?