@Riki-tiki-tavi

Как правильно написать тесты?

Есть задача хранить некоторую информацию, например в std::map, заносить ее и получать, если информации не оказалось то загружать из файла. Схематично это выглядит вот так:
Есть класс
header
class InfoHolder
{
        std::string getInfo(std::string id);
        void setInfo( std::string id, std::string info );
private:
       void loadInfo();
       std::string getInfoImpl(std::string id) const;
private:
        std::map<std::string, std::string> _info;
};



и его реализация
source
InfoHolder::setInfo(std::string id, std::string info)
{
        //Реализация
}
InfoHolder::getInfo(std::string id)
{
        std::string info = getInfoImpl(id);
        if ( info.empty() )
           loadInfo();
        return getInfoImpl();
}

InfoHolder::getInfoImpl(std::string id) const 
{
        std::map<std::string, std::string>::const_iterator it = _info.find(id)
        if ( it != _info.end() )
            return it->second;
        return "";
}

void helper()
{
     //Что-то делает
}

InfoHolder::loadInfo()
{
       //Читает из файла
       //использует функцию helper();
}



Как покрыть тестами весь код, особенно функции в private. Вызывать public функции с разными аргументами? Переставлять из private в public? Делать дружественный класс для тестирования? И как протестировать вспомогательную функцию helper(). Не хочется тащить ее в заголовочный файл.
А как написать класс используя подход TDD?
  • Вопрос задан
  • 438 просмотров
Пригласить эксперта
Ответы на вопрос 3
@andre_k
Тестироваться должен только публичный интерфейс
Ответ написан
Punk_Joker
@Punk_Joker
Software Engineer в ВО Овен
Я делал так, использовать идентификатор доступа protected вместо private, и большинство методов виртуальными. Потом создавал дочерний класс, и где надо реализовывал доп методы или методы которые переопределяли родительские, в которых выполнялись доп действия и вызывался родительский метод. И уже через этот дочерний класс, проводил тестирование.
Ответ написан
Комментировать
@Ariox41
Тестируется только интерфейс. Реализация для того и инкапсулирована, чтобы иметь возможность менять её произвольно, без зависимостей. Если реализация достаточно сложна для возникновения потребности в её тестировании - вам нужно вынести её в отдельные функции / классы, и тестировать уже их публичные интерфейсы как независимые модули.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы