C++ で単体テストを開始し、ベスト プラクティスを見つけようとしています。しかし今日、 boost interprocess を使用するコード、特にヘッダーのみで定義されている file_mapping と mapped_region を使用するコードを作成するときに、レンガの壁にぶつかりました。
私の一般的な質問は次のとおりです。ヘッダー ファイル (つまり、Boost と STL) でのみ定義されたコードに依存するクラスをテストする方法は?
例: 次の MyClass.h のようなクラスを作成するとします。
#pragma once
#include <stddef>
namespace boost { namespace interprocess {
class mapped_region;
}}
class MyClass
{
public:
MyClass(mapped_region& mapped_region);
std::size_t get_size() const;
private:
boost::interprocess::mapped_region& mapped_region_;
}
MyClass.cpp ファイル:
#include "MyClass.h"
#include <boost/interprocess/mapped_region.hpp>
using namespace boost::interprocess;
MyClass::MyClass(mapped_region& mapped_region)
: mapped_region_(mapped_region) {}
std::size_t MyClass::get_size() const
{
return mapped_region_.get_size();
}
MyClass::get_size() をテストするにはどうすればよいですか? Mapped_region はヘッダー ファイルにのみ実装されているため、基本的に他のオブジェクト ファイルから独立したオブジェクト ファイルが作成されます (別名、リンクは必要ありません)。
私が確認できる唯一の方法は、.cpp で #ifdefs を使用し、MyClass.cpp で次のようにすることです。
#ifdef RUN_UNITTEST
#include "my_fake_mapped_region.h"
#else
#include <boost/interprocess/mapped_region.hpp>
#endif
しかし、これは恐ろしいハックのように見え、製品コードをテストで感染させます。
テストコードでブーストを使用できると思いますが、それにはディスク上にファイルを作成する必要があり、技術的には単体テストではなく、統合テストになりますか? (用語について間違っていたらごめんなさい)。
この件に関する洞察をいただければ幸いです。