2010-04-09 1 views
5

내가 엑스 코드 사용하여 단위 테스트의 솔직히 끔찍한 세계로 다이빙을하기 위해 노력하고있어 (이 보인다 이러한 복잡한 과정을.) 기본적으로 내 Show.h 클래스 테스트를 시도,이 테스트 클래스가단위 테스트 용 GH 단위 목적 -C 코드, 왜 링크 오류가 발생합니까?

#import <GHUnit/GHUnit.h> 
#import "Show.h" 
@interface ShowTest : GHTestCase { } 
@end 

@implementation ShowTest 
- (void)testShowCreate 
{ 
    Show *s = [[Show alloc] init]; 
    GHAssertNotNil(s,@"Was nil.");  
} 

@end 

그러나 나는이 오류와 함께 신음 내 테스트를 빌드하고 실행하려고하면 : - 지금은이 추정하고 있습니다

Undefined symbols:

"_OBJC_CLASS_$_Show", referenced from:

[email protected] in ShowTest.o 

ld: symbol(s) not found

collect2: ld returned 1 exit status

가 연결 오류입니다. 내가 여기에있는 지침의 모든 단계 다음 시도 : - : 내가 링크 된 라이브러리에 내 프로젝트를 추가 할 수 있다고 생각 할수 있습니까

In the Target 'Tests' Info window, General tab:

Add a linked library, under Mac OS X 10.5 SDK section, select GHUnit.framework

Add a linked library, select your project.

Add a direct dependency, and select your project. (This will cause your application or framework to build before the test target.)

-

http://github.com/gabriel/gh-unit/blob/master/README.md

그리고 단계는이 지침이 나를 혼란 모든 파일이 .dylib, .framework 및 .o 파일을 수락하면 나열하십시오.

답변

7

테스트 대상이 응용 프로그램 인 경우 Show.h/m 파일을 수동으로 주 대상과 테스트 대상에 포함시켜야합니다.

나는 또한이를 반영 할 수있는 README를 업데이트

:

  • 주 대상이 라이브러리 인 경우 : 링크 된 라이브러리를 추가하고 당신의 주요 대상을 선택; 이렇게하면 테스트 대상을 기본 대상과 연결할 수 있으므로 수동으로 두 대상에 모두 소스 파일을 포함 할 필요가 없습니다.
  • 주요 대상이 응용 프로그램 인 경우 Test 프로젝트에 이러한 원본 파일을 수동으로 포함시켜야합니다.

죄송합니다. 두 대상 모두에 파일을 포함시키는 것은 이상적이지 않습니다.

+0

빠른 답장 Gabe (그리고 README 파일의 설명에 대한) 우수 감사합니다! 지금 작동하는 것 같습니다. – djhworld

+2

게이브, 다른 방법이 없습니까? 예를 들면 다음과 같습니다. http://stackoverflow.com/questions/6461074/linking-error-for-unit-testing-with-xcode-4, 두 대상에 소스를 추가하는 것은 약간 지저분한 일이며이를 염두에 두어야합니다 계산기 * 계산기 = [[계산기 ALLOC] 초기화 : 우리는 새로운 소스 파일을 추가 할 때마다, 나는, 그냥 궁금 : –

0

Show@implementation이 있어야합니다.

또는 당신은

Show* s = [[objc_getClass("Show") alloc] init]; 
... 

또는

Show* s = [[NSClassFromString(@"Show") alloc] init]; 
... 

런타임에 클래스를 해결하는 데 사용할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 이 작업이 실제로 수행되어야하는 방식입니까? 내가 도울 수 없지만 이것이 실제 해결 방법이 아닌 해결 방법이라고 생각합니다. – djhworld

+0

.... 또한 Show는 내가 테스트하려고하는 프로젝트의 클래스라는 점도 주목할 가치가 있습니다. 테스트 물건은 내 프로젝트에 직접 의존하여 별도의 타겟에 있습니다. – djhworld

+0

@djh : 링커는 분명히 Show 클래스를 찾을 수 없습니다. Show.m 파일을 테스트 대상에 포함 시켰는지 확인하십시오. – kennytm

0

어떻게 든 Apple의 예제는 대상에 .m 파일을 복제하지 않고 작동합니다. 여기

다운로드 애플의 단위 테스트 샘플 코드 (iPhoneUnitTests.zip) 다음 CalcTests 대상에

http://developer.apple.com/IPhone/library/samplecode/iPhoneUnitTests/Introduction/Intro.html

을 클릭합니다. 이 대상에 CalcTests.m 만 있습니다.

타겟을 빌드하십시오. CalcAppDelegate 또는 다른 클래스에 대한 링크 오류없이 빌드됩니다.

이 작품을 만드는 마법은 무엇입니까?

+0

여기 왜 애플의 iPhoneUnitTests 예를 들어, 링크 ... 그들은 같은 일을 피하기 위해 조심 불평하고 있지 않다 ]. 대신 다음과 같은 작업 만 수행합니다. CalcAppDelegate * delegate = [[UIApplication sharedApplication] delegate]; 이런 식으로 제한하는 것은 불행한 일이며, 문제를 해결하려면 KennyTM에서 제안한 것을해야합니다. –

+0

아마도 유닛 테스트가 실제로 객관적인 관점에서 어떤 것인지 혼란스러워할까요? 직장에서 Java 개발을 위해 JUnit을 사용하므로 클래스를 직접 테스트해야하는 TDD 및 유닛 테스트에 대한 좋은 경험이 있습니다. 어쨌든 답장을 보내 주셔서 감사합니다. '} – djhworld