gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:29:34 26 4
gpt4 key购买 nike

编辑:语言/平台是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com