使用密封的具体类对第三方API进行单元测试

时间:2011-03-15 13:45:51

标签: .net unit-testing sealed

刚刚开始使用TDD,一切顺利,直到我碰到这堵砖墙。

我正在围绕第三方API编写一个外观。 API非常好用于通过接口访问所有内容,因此在测试我的外观时很容易模拟。

整个API都是通过根接口访问的,并且您可以深入了解这个接口的深层次结构。我的外观在标准IoC实践的构造函数中使用了这个根接口。

TDD很顺利,因为我必须模拟整个界面树,因为使用深度接口时模拟会变得有点复杂。不过没什么大不了的,我只是维护了一个构建模拟器的辅助函数。它确实让我想知道我是否使用了正确的方法。

无论如何,在树的中间,我现在突然遇到一个密封的混凝土类型,没有公共构造函数,所以我无法嘲笑它。这导致我的测试失败,因为模拟的API总是为该成员返回null。

我能看到的唯一方法是为这种类型创建我自己的界面,并在我的立面上有一个虚拟方法来访问它。但是,这对我来说似乎很麻烦,因为我无法通过这种方法强制访问该类型,并且很容易忘记。 例如,它很自然地使用:

ConcreteType c = SomeInterface.ConcreteMember;

而不是:

IConcreteType c = GetConcreteMember(SomeInterface);

忘记这会导致测试失败。

我错过了一些基本的东西吗?正如我所说,我对单元测试非常陌生。

PS。我正在使用Moq。

1 个答案:

答案 0 :(得分:2)

使用moles。通过使用它,您可以为任何密封类型创建模拟(我自己,我最近使用它来提供System.Web.HttpContext.Current属性中的模拟)。

如果您查看下载文档(Microsoft Moles Reference Manual.docx),这应该为您提供足够的信息以帮助您入门。