如何防止 qFatal() 中止应用程序?

Dav*_*eer 3 qt unit-testing googletest

我的 Qt 应用程序使用 Q_ASSERT_X,它调用 qFatal(),它(默认情况下)中止应用程序。这对应用程序来说很棒,但我想在对应用程序进行单元测试时抑制这种行为。(我正在使用Google 测试框架。)我在一个单独的项目中进行了单元测试,静态链接到我正在测试的类。qFatal()的文档如下:

使用致命消息 msg 调用消息处理程序。如果尚未安装消息处理程序,则消息将打印到 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();
}
Run Code Online (Sandbox Code Playgroud)

但是我的应用程序仍然停留在断言处。我可以知道我的自定义处理程序正在被调用,因为运行我的测试时的输出是:

My Fatal: ASSERT failure in MyClass::doSomething: "doSomething()", file myclass.cpp, line 21 程序意外完成。

我该怎么做才能让我的测试在断言失败时继续运行?

Ada*_*m W 5

Q_ASSERT_X在进行发布构建时编译为

所以,对于单元测试,做一个发布版本,它不会调用 qFatal。