2016-07-07 52 views
1

在Windows斷言,我斷言宏本質上是這樣的:捕習俗在GoogleTest使用__debugbreak

#define MYASSERT(condition) (if (!(condition)) { ReportFailture(#condition, __FILE__, __LINE__, __FUNCTION__); __debugbreak(); } 

而在谷歌測試我試圖檢查的惡劣條件下的輸出測試界斷言出來,等:

ASSERT_DEATH({ MYASSERT(false); }, ""); 

然而這一切它報告以下消息:

Running main() from gtest_main.cc 
..\Test\FormatUnitTest\Test_Format.cpp(59): error: Death test: { if (!(false)) { ReportFailture("false", ..\\Test\\UnitTest\\Test.cpp", 59, __FSTREXP __FUNCTION_ 
_ ); __debugbreak(); }; } 

Result: illegal return in test statement. 
Error msg: 
[ DEATH ] 

似乎GoogleTest正在處理結構化異常處理程序(SEH)中的調試異常作爲特例。但是,我想要捕捉斷言並驗證它的內容。

什麼是正確的舉動?我是否需要爲Google測試定義一個特殊斷言宏?如果是的話,它應該怎麼做?

我注意到,用assert(false)替換我的斷言(通過assert.h包含)不會調用這個問題 - 它有什麼不同?

回答

1

問題是你打電話__debugbreak(),這會導致代碼拋出斷點異常。正如你在死亡測試文檔(https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests)中看到的那樣,如果代碼拋出一個異常,它不會被googletest中的死亡測試認爲是「死亡」。

至於你的其他問題去,assertASSERT.H卡列斯std::abort(這將導致程序終止)。根據死亡測試的定義,這是「死亡」。

+0

我將需要然後重新定義我的自定義斷言宏使用谷歌測試調用'std :: abort'而不是'__debugbreak()'這是不幸的,但我可以忍受。 – Steven