2012-09-26 4 views
1

나는 다음과 같은 어리석게 간단한 테스트 케이스 (correspondinghong.h 파일과 함께 .mm 파일로 정의 됨)가 있습니다. 부스트를 사용하여 문자열 스트림에서 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 행을 주석 처리하고 중단 점을 설정하면 도달하고 테스트 케이스에 일부 어설트를 포함 할 수 있고 예상대로 작동하기 때문에 테스트가 올바르게 설정되었다는 것을 알고 있습니다.

그냥 부스트 문제가 아닙니다. 나는 원래이 프로젝트를 다른 라이브러리를 호출 할 때 발생했지만 모든 것을 단순화하기 위해이 부스트 호출로 갔다. 이 코드는 코드의 다른 부분에서 똑같은 호출이 발생하므로 올바르게 연결된 부스트를 가지고 있다고 확신합니다. 네임 스페이스가 너무 길어서 틀린 버전의 함수를 링크하고 있다고 생각하지 않습니다.

저는 Xcode 4.5를 실행 중이지만 (4.4.1에서 같은 문제가 있습니다) OCUnit을 사용하여 유닛 테스트를 작성하려고합니다. 내가 작업하고있는 프로젝트는 이미이 프레임 워크로 작성된 몇 가지 단위 테스트를 가지고 있으며 이러한 테스트가있는 모든 것이 제대로 작동하는 것 같습니다.

나는 Objective C와 XCode에 익숙하지 않지만이 프로젝트를 확실히 설정 한 사람은 아니며 내가하고 있었던 일과 관련된 어떤 문제도 볼 수 없었고 우리는 완전히 혼란 스러웠다.

읽어 주셔서 감사합니다. 더 자세한 정보가 필요하면 알려주세요.

답변

0

C++ 예외가 발생하면 OCUnit barfs가 표시되고 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의 꽤 큰 버그처럼 보이기 때문입니다.