2015-07-29 3 views
7

Я хочу написать модульные тесты для тестирования конструкторов move/copy/настроек некоторых классов, которые я пишу. Я хочу убедиться, что ресурсы обработаны надлежащим образом, что вызов ctor вызывается, когда я ожидаю, что он будет вызван вместо копии ctor, и наоборот.Стратегия для модульного тестирования/копирования конструкторов?

Проблема в том, что я не хочу связываться с кодом класса, чтобы проверить это. Итак, есть ли способ узнать из тестового кода вне класса, когда был вызван переход или копирование/присвоения?

Что представляет собой общая стратегия для модульного тестирования копий/перемещений/присвоений?

PD: Я использую модульную модульную модуляцию Catch, поэтому, пожалуйста, предоставьте ответ, который может быть реализован в Catch.

+1

Можете ли вы предоставить определенный класс, для которого вы хотите написать тесты? – Barry

+0

@Barry Классы, над которыми я работаю, слишком сложны и специфичны, чтобы быть полезными в качестве примеров. Но stackoverflow.com полна примеров конструкторов перемещения. Любой из них - возможный сценарий, когда блок-тест должен выявлять проблему. – becko

+1

Итак, придумайте пример. Как бы то ни было, этот вопрос слишком широк. – Barry

ответ

2

Я никогда не использовал 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). Это поле открыто, поэтому вы можете проверить его после копирования/перемещения.Убедитесь, что вы заполняете его в своих конструкторах-конструкторах копирования/перемещения.

+0

Мне действительно интересно проверить, что перемещение перемещается, а копии копируются. То есть, я уверен, что перемещение и копирование создают точные копии, которые передают все мои «те же» тесты. Я хочу проверить эффективность. То есть, я хочу убедиться, что вместо того, чтобы ожидать, будут сделаны движения вместо копий. – becko

+0

@becko - Я обновил ответ. Надеюсь, это поможет. – camelCase

Смежные вопросы