问题

我想编写单元测试来测试我正在编写的一些类的移动/复制构造函数/ assignments.我想确保资源处理得当,当我希望调用它而不是复制ctor时调用移动ctor,反之亦然.

问题是我不想弄乱类代码以测试它.那么,有没有办法从类外的测试代码中知道,当调用移动或复制ctors / commission时?

unit-test副本/移动ctors/分配的通用策略是什么?

PD:我正在使用 Catch unit-testing框架,所以请提供一个可以在Catch中实现的答案.

  最佳答案

我从未使用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支持这个).例如,确保深层副本创建一个独特的副本(即不指向原始对象).

更新

您似乎更担心调用正确的移动或复制构造函数/赋值.如果您只想“移动赋值”或其他一些标识符,只要我不知道要建议什么.

当我测试副本时,我确保在我的单元测试中复制对象,然后调用依赖于成员变量浅/深副本的函数.当我测试移动时,这是相同的.在某些情况下,您可以在原始对象上运行测试(例如测试向量实例变量在移动后的大小为零).

我强制移动构造函数如下:

 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;
 

如果您真的需要这个,您可以从暴露枚举类字段的调试虚拟类继承.在您的调试中,构建该字段会填充一个适当的枚举值(motineconstructor).该字段会暴露,以便您可以在复制/移动后测试它.确保您在复制/移动构造函数/赋值方法中填充它.

  相同标签的其他问题

unit-testingc++11