Как проверить функции, которых нет в общедоступном интерфейсе? - PullRequest
0 голосов
/ 21 сентября 2009

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

Я создаю SerialDatastream , который является нижним уровнем и выполняет чтение и запись в COM-порт.

Я передаю указатель на это конструктору ProtocolDatastream , который интерпретирует байты при чтении из последовательного потока данных (хотя он только знает, что он соответствует моему интерфейсу Datastream ) и возвращает их в качестве единиц данных протокола.

Теперь, допустим, я хочу взять информацию с последовательного порта, а также записать ее в байтах за байтами. Я вставляю TeeDatastream в середине, который читает из одного источника, но выводит в два места назначения:

               +-----> Log
               |
Serial ----> Tee ----> Protocol

TeeDatastream реализован следующим образом: когда операция чтения выполняется из одной ветви, он буферизует данные в переменную-член. Затем, когда операция чтения выполняется в другой ветви, она считывает уже буферизованные данные.

(кстати, работает нормально)

Это означает, что после каждой операции класс должен проверять, существуют ли данные, прочитанные из обеих ветвей. Эти данные затем могут быть отброшены, и, таким образом, буфер уменьшается, а также увеличивается. Однако , это абсолютно невидимо для любого клиента класса. Поэтому мой вопрос: какой шаблон следует использовать для тестирования невидимых, но необходимых частей реализации?

Ответы [ 3 ]

2 голосов
/ 21 сентября 2009

Вам нужны юнит-тесты для самого Tee; независимо от его использования позже в других модульных тестах как часть сантехники.

Для этих новых модульных тестов «невидимая часть» - это то, что они должны охватывать. Это больше не скрытая функция, а часть API Tee.

Позже, когда вы уверены, что Tee работает правильно (и проведете необходимые тесты, чтобы убедиться, что он остается таким), вы можете использовать его и не обращать внимания на тот факт, как он работает.

1 голос
/ 21 сентября 2009

В файле cpp модульного тестирования локально объявите класс друга и объявите каждую защищенную функцию-член, которую вы хотите проверить.

class BlahTestable : public Blah
{
public: 
    using Blah::protectedfunction1;
    using Blah::protectedfunction2;
    etc....
};

Затем в модульном тесте выполните

// for public members
TEST_F(BlahTest, publicfunction) {
    Blah s;
    s.publicfunction();
}

// for protected members
TEST_F(BlahTest, protectedfunction1) {
    BlahTestable s;
    s.protectedfunction1();
}
0 голосов
/ 21 сентября 2009

Если я что-то упустил, похоже, вы ищете простое модульное тестирование. Этот тип тестирования позволяет вам тестировать как открытую, так и закрытую части вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...