我想编写单元测试来测试我正在编写的某些类的移动/复制构造函数/分配。我想确保资源得到适当处理,当我希望调用move ctor而不是copy ctor时调用它,反之亦然。
问题是我不想乱用类代码来测试它。那么,有没有办法从课外的测试代码中了解移动或复制ctors /赋值?
单元测试复制/移动ctors /赋值的一般策略是什么?
PD:我正在使用Catch单元测试框架,所以请提供一个可以在Catch中实现的答案。答案 0 :(得分:4)
我从未使用过Catch,因此无法提供一个有效的例子。
但是,我通过测试移动/复制的对象上的类方法,将复杂的复制/移动构造函数(例如涉及深层复制,std::unique_ptr
等)单元测试。
例如,如果我有一个类如下:
// constructor
Foo::Foo(int i) : privateMember(i) {};
// some function that operates on this private member
int Foo::bar() { return privateMember + 5 };
我会对bar()
方法进行测试,但是会为移动,复制等构造函数复制它。您可以轻松地完成原始测试的三到四次。
我没有公开成员变量。如果你这样做,你可以使用"是相同的"测试功能(假设Catch支持此功能)。例如,确保深层复制创建一个唯一的副本(即不会指向原始对象)。
<强>更新强>
您似乎更关心调用正确的移动或复制构造函数/赋值。如果您只是想要&#34;移动作业&#34;或其他一些标识符,我不知道该建议什么。
当我测试副本时,我确保在单元测试中复制对象,然后调用依赖于成员变量的浅/深副本的函数。当我测试移动时,这是相同的。在某些情况下,您可以对原始对象运行测试(例如,测试向量实例变量现在在移动后的大小为零)。
我按如下方式强制移动构造函数:
Foo foo{};
Foo bar(std::move(foo));
我按如下方式强制进行移动分配:
Foo foo{};
Foo bar{};
bar = std::move(foo);
我按如下方式强制复制构造函数:
Foo foo{};
Foo bar(foo);
我按如下方式强制进行复制分配:
Foo foo{};
Foo bar{};
bar = foo;
如果你真的需要这个,你可以从一些暴露枚举类字段的调试虚拟类继承。在调试版本中,字段将填充适当的枚举值(MoveConstructor)。此字段已公开,因此您可以在复制/移动后对其进行测试。确保在复制/移动构造函数/赋值方法中填充它。