Я никогда не использовал 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 поддерживает это). Например, убедитесь, что глубокая копия создает уникальную копию (т. Е. Не указывает на исходный объект).
Update
Вы, кажется, больше озабочены тем, что правильный ход или конструктор копирования/назначение называется. Если вы просто хотите «переместить назначение» или какой-либо другой идентификатор, я не знаю, что предложить.
Когда я проверяю копию, я удостоверяюсь, что копирую объект в своем модульном тесте, а затем вызываю функции, которые зависят от мелких/глубоких копий переменных-членов. Это то же самое, когда я тестирую движение. В некоторых сценариях вы можете запускать тесты на исходном объекте (например, проверить, что переменная векторного экземпляра теперь имеет размер нуля после перемещения).
заставляет конструктор двигаться следующим образом:
Foo foo();
Foo bar(std::move(foo));
заставляет назначение двигаться следующим образом:
Foo foo();
Foo bar();
bar = std::move(foo);
заставляет конструктор копирования следующим образом:
Foo foo();
Foo bar(foo);
I принудительно назначить копию следующим образом:
Foo foo();
Foo bar();
bar = foo;
Если вам это действительно нужно, вы можете наследовать от некоторого отладочного виртуального класса, который предоставляет поле класса enum. В вашей сборке отладки поле заполняется соответствующим значением перечисления (MoveConstructor). Это поле открыто, поэтому вы можете проверить его после копирования/перемещения.Убедитесь, что вы заполняете его в своих конструкторах-конструкторах копирования/перемещения.
Можете ли вы предоставить определенный класс, для которого вы хотите написать тесты? – Barry
@Barry Классы, над которыми я работаю, слишком сложны и специфичны, чтобы быть полезными в качестве примеров. Но stackoverflow.com полна примеров конструкторов перемещения. Любой из них - возможный сценарий, когда блок-тест должен выявлять проблему. – becko
Итак, придумайте пример. Как бы то ни было, этот вопрос слишком широк. – Barry