Модульное тестирование C - Возврат из заглушенной процедуры постепенного выхода

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

Очевидно, я хочу написать тест, который щекочет это условие, чтобы убедиться, что оно обрабатывается правильно, но я не хочу, чтобы процедура плавного выхода фактически выходила из программы, поскольку это остановит все оставшиеся тесты. Это означает отказ от изящной процедуры выхода. Проблема с заглушкой и отсутствием вызова 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 (aka goto) - способ сделать это, хотя не совсем элегантный способ. Есть идеи, как решить эту проблему?

РЕДАКТИРОВАТЬ # 2

Как упоминал fizzer, setjmp / longjmp - правильный способ справиться с этой ситуацией. Вполне вероятно, что я справлюсь с этим навсегда.

Я, однако, получил другое возможное решение от коллеги. Вместо # определения подпрограммы gracefulExit () к подпрограмме-заглушке, сделайте следующее:

#define gracefulExit return NULL

Конкретная тестируемая функция прекрасно справляется с этим, поскольку NULL является для нее допустимым возвращаемым значением. Я еще не тестировал это во всех возможных случаях (например, функция, которая имеет возвращаемое значение void). Как упоминалось ранее, я, скорее всего, воспользуюсь методом setjmp / longjmp для решения этой проблемы, но если это дополнительное решение натолкнет кого-нибудь на идею, отлично!

5
задан Taylor Price 10 August 2011 в 06:46
поделиться