我的课程看起来像这样:
标题(.h):
class DatabaseX ; //forward declare
class DeepClass
{
public:
void DeepClass(DatabaseX* db);
void doStuff();
private:
DatabaseX *m_db;
};
定义 (.cpp)
#include "some/path/that/stretches/into/a/rather/deep/structure/DeepClass.h"
#include "another/somewhat/disturbing/long/path/to/somewhere/distant/DatabaseX.h"
void DeepClass::DeepClass(DatabaseX* db):m_db(db){ m_db->open() }
void DeepClass::~DeepClass(){ m_db->close(); delete m_db; }
void DeepClass::doStuff(){ // <complicated stuff here> }
现在我想要一个测试来检查是否doStuff()
做正确的事情。
所以我写了我自己的 mock DatabaseX
。但是我有一个问题,我自己的模拟数据库位于测试目录中,它在生产代码中没有位置,更糟糕的DatabaseX
是,从未编写为被继承和重载。它是一个具体的类,与接口完全不同。
所以我的问题是,我如何编写一个测试,所有这些硬编码的包含路径无处不在?我是否例如:
- 创建另一个与包含路径匹配的重复文件结构,并将我的模拟
DatabaseX
放在这个重复的文件结构中? - 在编译器通过某种间接魔法或其他方式访问它之前,以某种方式重写每个 cpp 文件?
- 添加宏来吃掉路径?
- 在编译我的测试之前编写一个 python/perl/bash 脚本来临时删除包含路径?
- 只需包含所有内容,接受 的依赖项
DatabaseX
,然后编译真实的东西,以及它的所有依赖项,然后在链接时替换? - 接受失败;不要写任何测试,把我的头埋在沙子里。
- 或者 ... ?
我应该说有超过一百万行代码,因此更改源代码不是一种选择。有没有一种非常简单的方法可以通过一个简单的编译器选项或其他方式来克服这个噩梦?
(也许它不相关,但我正在使用 Qt 的 QTest 和 QtCreator。也许有一些神奇的开关可以让所有这些可怕的路径消失!)。
我正在使用 GCC 4.8.5