1

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

しかし、これは恐ろしいハックのように見え、製品コードをテストで感染させます。

テストコードでブーストを使用できると思いますが、それにはディスク上にファイルを作成する必要があり、技術的には単体テストではなく、統合テストになりますか? (用語について間違っていたらごめんなさい)。

この件に関する洞察をいただければ幸いです。

4

1 に答える 1