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

时间:2009-04-22 18:24:43

标签: tdd moq com-interop typemock

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

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

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

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

显然TypeMock支持这个(换取它自己的缺点),但是我宁愿不使用它有很多关于类型安全的原因以及我一般认为它背后有些狡猾的东西。

1 个答案:

答案 0 :(得分:4)

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

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

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

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