Мое приложение Qt использует Q_ASSERT_X, который вызывает qFatal (), который (по умолчанию) прерывает приложение. Это отлично подходит для приложения, но я хотел бы подавить такое поведение при модульном тестировании приложения. (Я использую Google Test Framework .) Я проводил юнит-тесты в отдельном проекте, статически связывая класс, который я тестирую. Документация для qFatal () гласит:
Вызывает обработчик сообщений с
фатальное сообщение Если нет сообщения
обработчик был установлен,
сообщение распечатывается на stderr. Под
Windows сообщение отправляется на
отладчик.
Если вы используете сообщение по умолчанию
обработчик, эта функция прервет
Системы Unix для создания дампа ядра. На
Windows, для отладочных сборок, это
функция сообщит _CRT_ERROR
позволяет подключить отладчик к
приложение.
...
Чтобы подавить вывод во время выполнения,
установите свой собственный обработчик сообщений с
qInstallMsgHandler ().
Итак, вот мой файл main.cpp:
#include <gtest/gtest.h>
#include <QApplication>
void testMessageOutput(QtMsgType type, const char *msg) {
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "My Fatal: %s\n", msg);
break;
}
}
int main(int argc, char **argv)
{
qInstallMsgHandler(testMessageOutput);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Но мое приложение все еще останавливается на утверждении. Я могу сказать, что вызывается мой пользовательский обработчик, потому что при выполнении моих тестов вывод:
My Fatal: сбой ASSERT в
MyClass :: doSomething: "doSomething ()",
файл myclass.cpp, строка 21 Программа
неожиданно закончил.
Что я могу сделать, чтобы мои тесты продолжали выполняться даже при сбое подтверждения?