Использование частично инициализированного объекта в тестах - PullRequest
0 голосов
/ 25 октября 2018

Меня беспокоит использование "неправильно" инициализированных объектов в модульных тестах.Допустим, я хочу протестировать функцию:

void foo(SomeClass)
{
 //do some stuff based on SomeClass.value
}

где:

class SomeClass 
{
OtherClass* ptr;
int uninterestingValue;
int value;
};

Что я хочу сделать, это создать функцию (доступную только в модульном тесте, а именно в анонимном пространстве имен), которая:

SomeClass createDummy()
{
SomeClass dummy(nullptr, 0, //initialize uninteresting fields with nullptr/0
                42)         //42 will be used for testing purpose
}

Причина: Создание объекта типа SomeClass является сложным, так как он используется для представления конечного состояния обработки данных в системе.Я бы хотел немного упростить это.

Считается ли это плохим подходом?

Есть ли лучшие способы добиться этого (конкретно говоря о C ++ / googletest?

1 Ответ

0 голосов
/ 25 октября 2018

У вас есть три части к вашему вопросу.Я не буду обсуждать, есть ли лучшие способы, но подход, о котором вы говорите, неплохой.

Идея использования фиктивных объектов только с реализованными важными частями стандартна.Существует несколько вариантов идеи использования тестовых двойников.Тестовые двойники включают в себя насмешки, подделки, заглушки и шпионы.Использование этих терминов для поиска в Google должно дать вам много информации об этой идее.Вот статья , которая объясняет разницу .Поскольку вы используете Google Test, вам следует выяснить, как вы можете использовать расширение Google Mock , чтобы ваш тест удвоился.

Вторая идея заключается в том, чтобы иметь конструктор для создания фиктивных объектов.,Двумя соответствующими шаблонами являются Object Mother и Test Data BuilderВы можете найти эти термины или начать с этой статьи .

...