問題タブ [qtest]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
45 参照

c++ - ヘッダーファイルに明示的なパスが含まれている場合に C++ クラスをテストする方法は?

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

ヘッダー (.h):

定義 (.cpp)

今、私は正しい種類のものをチェックするテストが必要です。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 を使用しています