тестовый буст для функции, принимающей пользовательский ввод - PullRequest
5 голосов
/ 08 марта 2011

У меня есть функция, которая принимает пользовательский ввод через std :: cin:

std::getline(std::cin, in);

и создает соответствующую структуру данных, сопоставляя ее с регулярным выражением. Затем функция возвращает эту структуру данных.

Я использую boost.test и хочу создать модульный тест для проверки правильности типа выходных данных с учетом некоторых входных данных Однако я не знаю, как это сделать, поскольку входные данные не передаются в качестве аргумента функции.

РЕДАКТИРОВАТЬ: Есть ли простой способ создать тестовый случай повышения, который передает функцию строку через стандартный ввод?

1 Ответ

7 голосов
/ 08 марта 2011

Если у вас есть доступ к исходному коду функции, которая вызывает std::getline, то самое простое решение - переписать его в качестве оболочки другой функции с такой же сигнатурой и реализацией, но с дополнительным параметром std::istream&, который используется вместо std::cin. Например, если у вас есть:

my_struct my_func()
{
    //...

    std::getline(std::cin, in);

    //...
}

Затем переписать так:

my_struct my_func(std::istream& is);

inline my_struct my_func()
{
    return my_func(std::cin);
}

my_struct my_func(std::istream& is)
{
    //...

    std::getline(is, in);

    //...
}

Таким образом, вы сможете проверить функциональность ядра my_func на сконструированных входных последовательностях, передав std::istringstream объекты в my_func(std::istream&).

Если у вас нет доступа к исходному коду функции, которая вызывает std::getline, то один из приемов, который вы можете использовать, - заменить стандарт в дескрипторе. См. этот ответ для кода, который заменяет стандартный дескриптор out и соответственно изменяет его.

...