0

次のようなクラスがあります。

ヘッダー (.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継承およびオーバーロードされるように記述されていませんでした。これは具体的なクラスであり、インターフェースのようなものではありません。

だから私の質問は、これらすべてのハードコーディングされたインクルードパスをどこにでも使用して、どのようにテストを書くのですか? たとえば、次のようにしますか。

  1. インクルード パスに一致する別の複製ファイル構造を作成しDatabaseX、この複製ファイル構造にモックを配置しますか?
  2. コンパイラが間接的な魔法などでアクセスする前に、どうにかして各 cpp ファイルを書き換えますか?
  3. マクロを追加してパスを使い果たしますか?
  4. テストをコンパイルする前にインクルード パスを一時的に削除する python/perl/bash スクリプトを作成しますか?
  5. すべてを含めて、 の依存関係を受け入れ、DatabaseX実際のものをコンパイルし、そのすべての依存関係をリンク時に置き換えますか?
  6. 敗北を受け入れます。テストを書かないで、頭を砂の中に埋めてください。
  7. また ... ?

100 万行をはるかに超えるコードがあるため、ソース コードを変更することはできません。シンプルなコンパイラ オプションなどを使用して、この悪夢を克服する非常に簡単な方法はありますか?

(関係ないかもしれませんが、私は Qt の QTest と QtCreator を使用しています。これらのぞっとするようなパスをすべてなくす魔法のスイッチがあるのか​​もしれません!)。

GCC 4.8.5 を使用しています

4

0 に答える 0