次のようなクラスがあります。
ヘッダー (.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()
だから私は自分のモックを書きDatabaseX
ます。しかし、私には問題があります。私自身のモック データベースは test ディレクトリに存在し、プロダクション コードには存在しません。さらに悪いことに、DatabaseX
継承およびオーバーロードされるように記述されていませんでした。これは具体的なクラスであり、インターフェースのようなものではありません。
だから私の質問は、これらすべてのハードコーディングされたインクルードパスをどこにでも使用して、どのようにテストを書くのですか? たとえば、次のようにしますか。
- インクルード パスに一致する別の複製ファイル構造を作成し
DatabaseX
、この複製ファイル構造にモックを配置しますか? - コンパイラが間接的な魔法などでアクセスする前に、どうにかして各 cpp ファイルを書き換えますか?
- マクロを追加してパスを使い果たしますか?
- テストをコンパイルする前にインクルード パスを一時的に削除する python/perl/bash スクリプトを作成しますか?
- すべてを含めて、 の依存関係を受け入れ、
DatabaseX
実際のものをコンパイルし、そのすべての依存関係をリンク時に置き換えますか? - 敗北を受け入れます。テストを書かないで、頭を砂の中に埋めてください。
- また ... ?
100 万行をはるかに超えるコードがあるため、ソース コードを変更することはできません。シンプルなコンパイラ オプションなどを使用して、この悪夢を克服する非常に簡単な方法はありますか?
(関係ないかもしれませんが、私は Qt の QTest と QtCreator を使用しています。これらのぞっとするようなパスをすべてなくす魔法のスイッチがあるのかもしれません!)。
GCC 4.8.5 を使用しています