刚刚开始 TDD,一切都很顺利,直到我碰到这堵砖墙。
我正在围绕第三方 API 编写外观。API 非常好,因为一切都通过接口访问,所以在测试我的外观时很容易模拟。
整个 API 是通过根接口访问的,您可以从中深入了解接口的深层层次结构。在标准 IoC 实践中,我的外观在其构造函数中采用了这个根接口。
TDD 进展顺利,但在使用深度接口时,模拟变得有点复杂,因为我必须模拟整个接口树。不过没什么大不了的,我只是维护了一个构建模拟的辅助函数。这确实让我怀疑我是否使用了正确的方法。
无论如何,在树的中间,我现在突然碰到了一个密封的混凝土类型,没有公共构造函数,所以我没有办法嘲笑它。这导致我的测试失败,因为模拟 API 总是为此成员返回 null。
我能看到的唯一方法是为这种类型创建自己的接口,并在我的外观上有一个虚拟方法来访问它。但是,这对我来说似乎很乱,因为我无法通过这种方法强制访问该类型,而且很容易忘记。例如,很自然地使用:
ConcreteType c = SomeInterface.ConcreteMember;
代替:
IConcreteType c = GetConcreteMember(SomeInterface);
忘记这一点会导致测试失败。
我错过了一些基本的东西吗?正如我所说,我对单元测试很陌生。
附言。我正在使用起订量。