3

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

我正在围绕第三方 API 编写外观。API 非常好,因为一切都通过接口访问,所以在测试我的外观时很容易模拟。

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

TDD 进展顺利,但在使用深度接口时,模拟变得有点复杂,因为我必须模拟整个接口树。不过没什么大不了的,我只是维护了一个构建模拟的辅助函数。这确实让我怀疑我是否使用了正确的方法。

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

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

ConcreteType c = SomeInterface.ConcreteMember;

代替:

IConcreteType c = GetConcreteMember(SomeInterface);

忘记这一点会导致测试失败。

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

附言。我正在使用起订量。

4

1 回答 1

2

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

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

于 2011-03-15T14:40:19.977 回答