2012-09-26 54 views
1

我有以下愚蠢簡單的測試用例(在具有相應的.h文件的.mm文件中定義)。它使用boost來嘗試從stringstream中讀取一個ptree來模擬文件中的文本。XCode OCUnit與中止陷阱崩潰:6在任何測試代碼運行之前

-(void)setUp { 
    printf("setup\n"); 

    ::std::stringstream ss; 
    ss << "bad format text"; 

    _configuration = new ptree(); 
    ::boost::property_tree::read_json(ss, *_configuration); 
} 

tearDown函數什麼都不做,並且有一個測試用例,它也什麼都不做。如果我註釋掉read_json行,一切正常。但是,如果我運行它原樣,我得到:

Test Case '-[TestPlanner testPlanner]' started. 
libc++abi.dylib: terminate called throwing an exception 
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include: line 415: 3320 Abort trap: 6   "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" 
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/Developer/usr/bin/otest' exited abnormally with code 134 (it may have crashed). 

真正瘋狂的事情是,如果我在設置功能中設置斷點,它甚至不運行!而且這是唯一啓用的測試,所以即使沒有運行單一測試的一行,也會崩潰。我知道測試的設置是正確的,因爲如果我註釋掉read_json行並設置一個斷點,它已經達到了,並且我可以在測試用例中包含一些斷言,並且它們按預期工作。

這不僅僅是一個助推器問題。我最初在從我自己的項目中調用不同的庫時遇到過這個問題,但是爲了簡化所有我簡單介紹的內容,只是簡單介紹一下這個boost調用。這個完全相同的調用發生在代碼的其他部分,所以我很確定我的boost已正確鏈接。我對命名空間超級冗長,所以我不認爲我連接了錯誤版本的函數或其他東西。

我正在運行XCode 4.5(但在4.4.1上有同樣的問題)並嘗試使用OCUnit編寫單元測試。我正在開發的這個項目已經在這個框架中編寫了一些單元測試,並且這些測試的一切似乎都正常。

我是Objective C和XCode的新手,但將此項目明確設定的人並不是,他看不出我在做什麼的任何問題,而且我們都完全陷入困境。

感謝您的閱讀!讓我知道你是否需要更多信息。

回答

0

事實證明,如果OCUnit barfs得到C++異常,並且出於某種原因,XCode(或者可能是lldb)沒有正確觸發斷點。 SetUp代碼正在運行,調試器無法正常工作。添加try/catch塊或代碼更改爲:

-(void)setUp { 
    printf("setup\n"); 

    ::std::stringstream ss; 
    ss << "{}"; 

    _configuration = new ptree(); 
    ::boost::property_tree::read_json(ss, *_configuration); 
} 

不會引起異常,使一切工作。

因此,如果您看到此問題的解決方法是確保您嘗試/捕獲測試用例中的所有內容。希望有人會想出更好的答案,因爲這看起來像是OCunit中的一個非常大的錯誤。