2013-01-25 55 views
1

我剛剛開始使用VS2012中的MSTest。我正在測試本機C++。VS2012 MSTest無法捕捉斷言,原生C++

我在我的應用程序中犯了一個錯誤,讀了一個STL字符串的'結尾'......例如,

wchar_t c = p_filename [p];

..在我的情況p是20000和p_filename是一個空字符串。顯然是一個錯誤。在調試器中運行時,會觸發:

「調試斷言失敗!! ..字符串下標超出範圍......(按重試以調試應用程序)」。

但是 - 在MSTest中運行此代碼通過測試。沒有錯誤報告。爲什麼不是MSTest撿起這個運行時錯誤? (或MSTest沒有檢測到原生C++中的斷言語句)? MSTest不應該報告這個嚴重的錯誤嗎?

回答

1

當STL在調試模式下檢測到問題時,它會調用_CrtDbgBreak(),通常會顯示一個對話框讓您調試問題。然而,在MSTest下運行,沒有任何反應。沒有對話框,MSTest可能會報告成功。 我通過掛鉤_CrtDbgBreak()並觸發一個assert()來解決這個問題,它使用了不同的機制__debugbreak內部函數。在這種情況下,觸發熟悉的「Press」重試「調試」對話框。

int MyReportHook(int nRptType, char *szMsg, int *retVal) 
{ 
    if(_CRT_ASSERT == nRptType) 
    { 
     assert(false); 
    } 
    return 0; 
} 

TEST_CLASS(UnitTest1) 
{ 
public: 
    TEST_METHOD_INITIALIZE(methodName) 
    { 
     _CrtSetReportHook(MyReportHook); // hook STL asserts. 
    } 

    TEST_METHOD(TestMethod1) 
    { 
     Assert::IsTrue(StripExtension(L"") == L""); // test for handling empty strings. 
     Assert::IsTrue(StripExtension(L"test.txt") == L"test"); 
    } 

}; 
0

這是由於在CppUnitTest.h文件中完成斷言的重定向。

  _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); 

這裏的意圖是,你不希望你的自動化阻塞對話框。顯然不是你想要的。但是,您可以根據需要編輯此標題並將其啓用。