我开始在 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
但这似乎是一个可怕的黑客攻击,并通过测试感染了生产代码。
我想可以在测试代码中使用 boost,但这需要在磁盘上创建文件,从技术上讲,它不再是单元测试,而是集成测试?(对不起,如果我对术语有误)。
我真的很感激关于这个问题的一些见解。