Я использую GoogleTest и хочу протестировать некоторые функции с #ifndef внутри.
файл a.c
bool myFunction() {
#ifndef FOO
return true;
#else
return false;
#endif
}
Можно ли принудительно использовать #undef во время определенного теста? Таким образом, я могу протестировать функцию в двух статистических данных (с определением и без).
Поскольку вы можете заменить некоторую функцию внутри теста на MOCK, я надеюсь, что есть что-то для определения
Проблема в том, что FOO - это символ препроцессора. Определено ли это или нет ... - это вопрос, который имеет смысл только во время компиляции кода. Итак, чтобы получить то, что вы хотите, нам нужен механизм, с помощью которого Google Test скомпилирует две версии вашего теста, одну с определением и одну без. Не уверен, что такая утилита существует.





Это одна из причин, по которой люди стараются избегать создания нескольких версий функции, которую вы создаете с помощью #define, #if и т. д. Трудно протестировать все эти разные версии.
Если вы хотите протестировать обе версии, вы должны скомпилировать свою программу дважды (один с #define FOO и один без него), а затем запустить тесты отдельно. Единственный способ изменить значение FOO, как написано, - это перекомпилировать программу.
В качестве альтернативы вы можете реорганизовать свой код, чтобы в #define не было необходимости.
Я использую много #define, потому что работаю со встроенной системой, и мне нужно много оптимизации, и препроцессор - хороший способ сделать это. Рефакторинг кода - это не вариант, я пытаюсь убедить своих коллег реализовать модульные тесты, если нам придется реорганизовать код, ответов будет НЕТ.
@ P.Paul-Alexandre - Значит, ваша компания создала кодовую базу, полную условно скомпилированных фрагментов, без включения тестирования в исходный процесс развертывания? Ой
отсутствие модульного теста вовсе не означает отсутствие теста. @DietrichEpp дважды скомпилировать программу - это хорошая идея, спасибо.
Я думаю, ваш вопрос в том, можно ли перекомпилировать исходный файл во время теста Google, и я думаю, что нет.