2012-07-22 1 views
1

내 프로젝트가 앱이 아닌 정적 라이브러리라는 점을 제외하고는 RestKit 유닛 테스트 가이드 (https://github.com/RestKit/RestKit/wiki/Unit-Testing-with-RestKit)를 따르려고합니다. 나는 시험의 첫 번째 줄에이 오류가 테스트를 실행하려고하면유닛을 RestKit으로 정적 라이브러리 테스트하기

- (void)testMappingOfDate 
{ 
    id parsedJSON = [RKTestFixture parsedObjectWithContentsOfFixture:@"plan.json"]; 
    RKMappingTest *test = [RKMappingTest testForMapping:[self planMapping] object:parsedJSON]; 
    [test expectMappingFromKeyPath:@"plan.date" toKeyPath:@"date"]; 
    STAssertNoThrow([test verify], nil); 
} 

가 : 여기

내가 작성한 테스트입니다

error: testMappingOfDate (api_clientTests) failed: -[NSBundle parsedObjectWithContentsOfResource:withExtension:]: unrecognized selector sent to instance 0x1765c40 

그것은처럼 보인다는 RestKit에서 정의한 NSBundle 범주를 찾지 못했지만 테스트 대상 헤더 검색 경로가 "$(BUILT_PRODUCTS_DIR)/../../Headers"으로 설정되어 있고이 경로에 "인식 할 수없는 선택기"가 포함 된 NSBundle+RKAdditions.h이 포함되어 있음을 확인했습니다.

여기에 누락 된 것이 있습니까?

답변

2

라이브러리에서 오는 바이너리 내에 카테고리를 포함하려고합니다. 이 작업을 수행하려면 다음을 (Unit-Test-Target) 빌드 설정에 추가해야합니다.

다른 링커 플래그 : -ObjC

enter image description here

From Apple's QA :

오브젝티브 C는 (오브젝티브 C 또는 방법) 링커 각 기능에 대한 심볼을 정의하지 않는다 - 대신 링커 기호는 각 클래스에 대해서만 생성됩니다. 범주가있는 기존 클래스를 확장하면 링커는 코어 클래스 구현의 개체 코드와 범주 구현을 연결하는 것을 모릅니다. 이렇게하면 결과 응용 프로그램에서 생성 된 개체가 해당 범주에 정의 된 선택기에 응답하지 않습니다.

솔루션 :

이 문제를 해결하려면, 정적 라이브러리는 링커에 -ObjC 옵션 을 통과해야한다. 이 플래그는 링커가 Objective-C 클래스 또는 범주를 정의하는 라이브러리에있는 모든 오브젝트 파일 을로드하게합니다. 이 옵션을 사용하면 일반적으로 추가 개체 코드가 응용 프로그램에로드되기 때문에 더 큰 실행 파일이 생성되지만 은 기존 클래스의 범주가 포함 된 효과적인 Objective-C 정적 라이브러리를 성공적으로 만들 수 있습니다.

+0

입니다. 무료 개발자 계정을 사용하고 있지만 조회가 효과가 있다고 생각하지는 않습니다. Google이 http://developer.apple을 제공하는 것처럼 보입니다. – Mark

+0

이것은 문제를 변경하는 것처럼 보입니다. 이제는 다음과 같은 오류가 나타납니다.'아키텍처 i386에 대한 정의되지 않은 기호 : "_CFHTTPMessageAddAuthentication"(참조 된 곳 : - [[ [RKRequest addHeadersToRequest] in libRestKit.a (RKRequest.o) - libopentripplanner-api-client.a (RKRequest.o)의 [RKRequest addHeadersToRequest]' – mark

+0

다른 라이브러리도 연결해야합니다. 사용할 라이브러리의 문서를 확인하십시오. "링크 할 프레임 워크"를 찾으십시오. – Till

1

오류는 "인식 할 수없는 선택기"문제가 런타임에 발생 함을 의미합니다. 컴파일러와 NSBundle + RKAdditions.h는 timr을 컴파일 할 때이 오류를주지 않습니다.

@implementation NSBundle(RKAdditions) 코드는 앱에 연결되어 있지 않습니다. 따라서 이것을 빌드에 추가해야합니다.

+0

내 테스트의 "링크 바이너리 라이브러리"에'libReskKit.a'를 추가 했는데도 여전히 같은 오류가 나타납니다. – mark

+0

@mark - 정적 라이브러리를 만들거나 단위 테스트를 실행 하시겠습니까? – Mark

+0

이제'libReskKit.내 정적 라이브러리와 내 단위 테스트 번들 둘 다의 "Link With Binary With Libraries"섹션에있는 "a". – mark