我的Qt應用程序使用Q_ASSERT_X,它調用qFatal(),它默認會中止應用程序。這對於應用程序來說很好,但是我想在單元測試應用程序時抑制這種行爲。 (我使用的是Google Test Framework。)我在單獨的項目中使用單元測試,靜態鏈接到正在測試的類。該documentation爲qFatal()讀取:如何防止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();
}
但我的應用程序是在斷言仍停止。我可以告訴大家,我的自定義處理程序被調用,因爲我運行測試時的輸出是:
我的致命:ASSERT失敗 MyClass的:: DoSomething的:「DoSomething的()」, 文件myclass.cpp,第21行程序 已意外完成。
我該怎麼做才能保證即使斷言失敗時我的測試仍能繼續運行?
Qt是開源的,它可以在這裏:http://qt.gitorious.org/qt – 2010-04-30 19:54:29
謝謝,Kaleb。臭死了。那種嚴厲的,但我想我只是使用預處理器從調試版本中排除「預期的失敗」測試,並且只針對發佈版本進行測試。 – 2010-04-30 19:57:07
感謝@亞當 - 我檢查了github,但在那裏找不到它,Google沒有在搜索結果中的任何合理位置列出它。 – 2010-04-30 20:13:59