Добрый день, господа разработчики!
Я делаю небольшой проект консольной игры, и стараюсь охватить юнит тестами максимальное количество функций. Для тестирования использую Google Test. У меня возникло затруднение с тестированием простой, но важной функции:
void Players::CreatePlayer() {
std::cout << "Введите имя игрока: ";
std::string name = ReadLine();
//проверим, что такого игрока нет
while (CheckName(name)) {
std::cout << "Такой игрок уже есть. Попробуйте ещё раз!\nВведите имя игрока:";
name = ReadLine();
}
AddPlayer(name);
}
//ReadLine - это вспомогательная функция для считывания строки
Вот какая логика тут реализована:
1. Есть private-функция AddPlayer, которая добавляет игрока в private-множество.
2. Функция CreatePlayer является public функцией, которая позволяет считать имя игрока, валидировать его через private-функцию CheckName и передать в AddPlayer.
Я хочу написать тестировать эту логику через юнит тест. Но как это сделать, если в CreatePlayer нужно вводить данные, а AddPlayer является private?
Я думал о двух вариантах:
1. Вытащить AddPlayer в public, но делать этого не хочется, т.к. в моей задумке пользователь напрямую не взаимодействует с этой функцией.
2. Позволить тестам залезть в private-секцию через #define private public, как это описано
здесь. Но, насколько я понял
...this suggestion is extremely bad coding practice
В итоге, какой наиболее корректный способ есть решить эту проблему? Если менять архитектуру, то как?