正如此线程中的其他用户(Fraser)所指出的,Googletest 不会捕获从 Qt for ex 抛出的断言。Q_ASSERT 或 Q_ASSERT_X。也就是说,用户需要对 Qt 应用程序显示的 UI 对话框执行操作。
QtMsgHandler来救援。这是您可以解决此问题的方法。
定义如下所示的函数:
void myMessageOutput(QtMsgType type, const char *msg)
{
switch (type)
{
case QtDebugMsg:
fprintf(stdout, "Debug: %s\n", msg); // you can also use stderr if you want
break;
case QtWarningMsg:
fprintf(stdout, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stdout, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stdout, "Fatal: %s\n", msg);
abort();
}
}
在您期望断言的 Googletest 应用程序中,以下列方式调用它:
// Redirect all messages generated from Qt to stdout
qInstallMsgHandler(myMessageOutput);
// Call death testcase
EXPECT_DEATH(call_causing_assertion(),"");
// Restore the default message handler
qInstallMsgHandler(0);
您还可以通过以下方式进行调用,以抑制来自测试应用程序的所有 Qt 断言对话框:
int main(int argc, char **argv)
{
qInstallMsgHandler(myMessageOutput);
//QApplication app(argc, argv);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
//...
//return app.exec();
}