В настоящее время я пытаюсь написать модульный тест для некоторого устаревшего кода. В одной из моих функций он вызывает другую функцию. Согласно возвращаемому значению внутренней функции, существуют три условия ветвления. Код написан на C ++, и я использую фреймворк cxxtest. Как я могу манипулировать возвращаемым значением внутренней функции, не вдаваясь в ее реализацию, чтобы я мог пройти через все условия ветвления? Я предпочитаю избегать зависимостей между функциями. Есть какой-либо способ сделать это?
Уже есть зависимость между функциями. Один зовет другого.
Решение состоит в том, чтобы изменить внешнюю функцию, чтобы она принимала в качестве параметра внутреннюю функцию. Затем вы можете передать функцию, которая возвращает любое значение, которое вам понравится при тестировании, и полезную функцию в остальной части приложения.
Вероятно, связать его во время компиляции, например,
struct inner_function {int operator()();}
struct mock {int operator ()();}
template <typename F = inner_function>
int outer_function()
{
if (F {}())
return 1;
else
return 2;
}// in a test
int r = outer_function <mock>();
Вы можете сделать это во время выполнения с помощью указателей на функции, если хотите. Я бы, вероятно, добавил еще одну обертку, чтобы скрыть шаблон от клиентского кода.
Я нашел решение. Я создал новый заголовочный файл с именем new_header.hpp. В файл добавлена функция с таким же синтаксисом, как и функция сокета:
int socket(int domain, int type, int protocol)
{
if(domain == CONST1)
return -1;
else if(domain == CONST2)
return 1;
}
Затем в файле cmake я создал библиотеку для запуска UT. Я добавил этот новый new_header.hpp с другими необходимыми файлами в качестве зависимости. Кроме того, я включил этот файл в заголовок моего недавно созданного файла UT. Вуаля, манипулируя одним из значений в параметре, я смог смоделировать необходимые функции. Добавление макетов для пользовательских функций также работает аналогичным образом.