2013-02-09 9 views
12

私は手続き型C/C++プロジェクトに取り組んでいます。パブリックインターフェイスは4つの関数で構成され、それぞれにはかなり複雑なタスクがあります。同じcppファイル内に名前のない名前空間で宣言されているヘルパー関数があります。使用されているテストフレームワークはGTestです。ユニットテスト無名空間のC++コード

しかし、これらのヘルパー関数の一部は、独自の単体テストを必要とするほど複雑になっています。通常、私はこれらのヘルパーをテスト可能なユニットにリファクタリングしますが、プロジェクトの要件によってすべてが1つのcppにある必要があり、指定された関数だけが公開されていることが示されます。

カップリングを最小限に抑えながら、できるだけプロジェクトの要件に沿ってユニットテストを行う方法がありますか?

可能な解決策は、マクロを使用して名前空間をテスト用に指定し、プロダクション用に名前を付けないことです。しかし、それは私が望むよりもちょっと混乱しているようでした。

+0

[プライベートメソッド、フィールドまたは内部クラスを持つクラスをテストするにはどうすればよいですか?](https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that -has-private-methods-fields-or-inner-classes) – Raedwald

答えて

12

匿名の定義と宣言の両方は、同じ翻訳単位内でのみ表示されます。namespace

これらのプライベート関数を単体テストするには2つの方法があります。

#include ファイルで.cppファイル全体がテストされます。 (#include.cppファイルをINGのは、コードを再利用するための良い方法ではありません! - あなたは、生産コードでこれを行うべきではありません)

おそらく、より良いアプローチはfoonamespaceプロジェクトであるfoo::internalnamespace、にプライベートコードを移動することです通常、プライベート宣言を使用して-internal.hファイルに入れます。あなたの生産.cppファイルとあなたのテストはこの内部ヘッダーを含めることができますが、あなたのクライアントはそうではありません。このようにして、内部実装をクライアントに漏らさずに完全にテストすることができます。

+0

ありがとう、それは多くの助けになります。 –

+6

2番目の方法では、オブジェクトを名前付き名前空間に移動すると、参照可能なランタイムIDが保持されることになり、匿名名前空間を使用する理由が排除されてコンパイル単位からのアクセスが完全に禁止されます...また、 ... – Eonil

+0

本当にあなたの最初のアイデアが好きです。誰かがそれをするために私を撃つかどうか分かります。 – zehelvion