Манипуляции с возвращаемым значением внутренней функции для модульного тестирования?

В настоящее время я пытаюсь написать модульный тест для некоторого устаревшего кода. В одной из моих функций он вызывает другую функцию. Согласно возвращаемому значению внутренней функции, существуют три условия ветвления. Код написан на C ++, и я использую фреймворк cxxtest. Как я могу манипулировать возвращаемым значением внутренней функции, не вдаваясь в ее реализацию, чтобы я мог пройти через все условия ветвления? Я предпочитаю избегать зависимостей между функциями. Есть какой-либо способ сделать это?

2

Решение

Уже есть зависимость между функциями. Один зовет другого.

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

Вероятно, связать его во время компиляции, например,

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>();

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

2

Другие решения

Я нашел решение. Я создал новый заголовочный файл с именем 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. Вуаля, манипулируя одним из значений в параметре, я смог смоделировать необходимые функции. Добавление макетов для пользовательских функций также работает аналогичным образом.

1

По вопросам рекламы [email protected]