【发布时间】:2014-01-10 17:07:37
【问题描述】:
我正在开发一个广泛使用单例模式以及一些全局模式的大型代码库。我刚刚开始尝试编写一些单元测试,但是单例和全局给我带来了很多问题,在阅读之后,依赖注入似乎是要走的路。
进行此更改的重构任务非常艰巨,我正在尝试找出最佳方法。据我了解,基本思想是采取这样的做法:
foo()
{
GraphicsCache::Instance()->GetMyImage();
// do stuff
}
把它变成这样的东西:
foo(GraphicsCache *Cache)
{
Cache->GetMyImage();
// do stuff
}
这样我就可以模拟这些对象并在我的测试中使用这些模拟。但是有很多这些类型的对象(事件记录器、网络对象、其他缓存等),这几乎意味着我最终将在各处传递大量对象,并最终添加一个到处都是很多代码。我有正确的想法吗?有没有更好的方法来做到这一点?
我的一个想法是拥有一个对象,它是所有这些当前全局对象的容器,我所要做的就是传递一个引用,但这感觉不对,因为大多数地方都不会不需要访问每一个全局对象,只是一个子集。
【问题讨论】:
-
回复:您关于传递单个对象的想法。您只是在传递一个指向全局对象的指针。其他例程是否需要它们并不重要:您不会传递大量数据:只是一个指针。信息在那里,但他们不必使用它。这就像随身携带一部具有您从未使用过的功能的手机。它们在那里,但您不必使用它们。没有这些功能,手机不会更轻。
标签: c++ unit-testing design-patterns dependency-injection tdd