Вот сценарий, который у меня есть.У функции, которую я тестирую, есть условие ошибки, при нажатии которого вызывается изящная функция выхода для освобождения любой глобальной памяти, закрытия дескрипторов и выхода из программы.
Очевидно, я захочу написать тестэто щекочет это условие, чтобы убедиться, что оно обрабатывается правильно, но я не хочу, чтобы изящная процедура выхода действительно выходила из программы, так как это остановило бы все оставшиеся тесты.Это означает заглушение изящной процедуры выхода.Проблема с заглушкой и отсутствием вызова exit заключается в том, что поток управления возвращается к тестируемой функции (что плохо, поскольку подпрограмма должна была завершиться).
Вот актуальный вопрос: как вернуть управлениеот заглушки к тесту, а не к тестируемой функции?
Я могу сделать setjmp / longjmp, но, поскольку "gotos" в целом плохи, я бы с удовольствием принял любые другие предложения.(Имейте в виду, что это процедурный C, а не C ++, поэтому исключения не будут работать, насколько я знаю)
EDIT Как Сорен и другие предложили ниже, делая выходничего не делать, когда тестирование - отличная идея.Есть несколько способов сделать это, будь то с помощью оператора #define или заглушки для процедуры exit ().
ОДНАКО, выполнение этого представляет проблему, для которой я действительно ищу решение (кромеsetjmp / longjmp).Взгляните на этот сценарий:
void gracefulExit() {
// Clean Up
exit();
}
void routineUnderTest() {
// Do some calcs
if (someBadCondition == TRUE)
gracefulExit()
// Do some more calcs
}
Если exit () ничего не делает в этом сценарии, gracefulExit () вернет управление обратно тестируемой подпрограмме, что не должно происходить.Следовательно, мне нужен способ заставить exit () (или заглушенную версию gracefulExit ()) возвращать управление тесту вместо тестируемой функции.
setjmp / longjmp (он же goto) - это способсделать это, хотя не очень элегантно.Любые идеи о том, как решить эту проблему?
EDIT # 2
Как уже упоминалось в fizzer, setjmp / longjmp - верный способ справиться с этой ситуацией.Вполне вероятно, что я справлюсь с этим навсегда.
Однако я получил другое возможное решение от коллеги.Вместо # определения процедуры gracefulExit () для процедуры-заглушки, выполните следующее:
#define gracefulExit return NULL
Тестируемая конкретная функция прекрасно справляется с этим, поскольку NULL является допустимым возвращаемым значением для нее.Я еще не проверял это в каждом возможном случае (например, функция, которая имеет возвращаемое значение void).Как упоминалось ранее, я, вероятно, буду использовать метод setjmp / longjmp для решения этой проблемы, но если это дополнительное решение вызывает у кого-то идею, прекрасно!