2011-03-19 2 views
12

iPhone 응용 프로그램에 대한 간단한 OCUnit 테스트를 사용하고 있었고 응용 프로그램 대리인이 내가 예상 한 클래스의 인스턴스라고 주장하고 싶었습니다. 이 테스트가 매우 유용 할 것으로 기대하지는 못했지만 목표 C에 관한 오해가 있음이 드러났습니다.isKindOfClass와 NSStringFromClass는 UIApplicationDelegate에 대해 동의하지 않습니다.

먼저 델리게이트에 대한 참조를 얻습니다. 그런 다음 되돌아 오는 클래스의 이름을 기록합니다. 필자의 경우, 결과물에 "앱 대리인의 클래스 이름은 CalculatorAppDelegate"라고 올바르게 표시됩니다.

그러나 다음 줄의 어설 션이 실패하고 그 이유를 알 수 없습니다. isKindOfClass false를 반환하면서

- (void)testAppDelegate 
{ 
    id appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class])); 
    NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]); 
    NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]); 
    NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]); 
    STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf"); 
} 

은 어떤 상황 NSStringFromClass()가 올바른 클래스 이름을 반환 할 수 있을까? 그것이 도움이되지만 그것을 할 경우

NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]); 

확실하지 : 작업의 반환 값이

NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]); 

하고 심지어는 경우 멤버를 테스트 할 수 있습니다 뭐죠

2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate 
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0 
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0 
2011-03-19 15:51:13.865 Calculator[40092:207] class == class 0 
/Users/pohl/Developer/FoundationCalculator/CalculatorTests/CalculatorBrainTests.m:37: error: -[CalculatorBrainTests testAppDelegate] : "[appDelegate isKindOfClass:[CalculatorAppDelegate class]]" should be true. wtf 
Test Case '-[CalculatorBrainTests testAppDelegate]' failed (0.002 seconds). 

답변

11

테스트 대상을 올바르게 구성하지 않았습니다. this guide for unit testing applications을 따라 갔다면 계산기, 계산기 테스트계산기 테스트의 세 가지 목표가 있어야합니다. CalculatorTests의 '빌드 단계'섹션을 확인하십시오. '컴파일 소스'에는 SenTestCase 소스 파일 만 나열되어야합니다. 나는 CalculatorAppDelegate.m과 그 밖의 다른 파일을 추가했다. 이것은 CalculatorTesting 대상을 빌드 할 때 같은 응용 프로그램에 연결된 동일한 소스 파일의 중복 어셈블리로 이어질 것입니다. 그것은 당신의 주장이 실패하는 이유를 설명합니다.

편집 :은 그냥 그냥> 편집 구성표를 프로젝트에 갈 엑스 코드 4의 CalculatorTesting 대상이 필요합니다 ... 그리고 단위 테스트 번들이 테스트 섹션에 나열되어 있는지 확인하지 않는 것이 실현 . 그런 다음 Cmd-U를 사용하여 단위 테스트를 실행할 수 있습니다.

+0

XCode4에서이 프로젝트를 새로 만들었고 나를 위해 자동으로 단위 테스트 대상을 설정했습니다. 나는 완벽하게 작동하는 많은 주장들을 가지고 꽤 많은 테스트를하고있다. 실패한 단 한가지 주장입니다. 내 목표가 올바르게 설정되지 않은 경우가있을 수 있습니까?CalculatorTesting 대상이없는 것 같습니다. 위의 주장은 장치에서 실행해야하는 응용 프로그램 테스트라고 할 수 있습니다. 관련 메모에서 링크 된 페이지의 지침은 Xcode 4가 대상을 설정하는 방법과 일치하지 않습니다. 4에서 목표물을 만드는 방법에 대한 정보는? – pohl

+1

나는 타겟을 정확하게 설정하지 않았 음을 확신한다. 나는 Xcode 4와 함께 일하고있어 당신의 문제를 테스트했다. Xcode 4에서는 프로젝트 개요에서 일반 앱 타겟을 선택하고 복제해야합니다 (Cmd-D). 이름을 CalculatorTesting으로 지정하고 OCUnit 테스트 대상을 종속성으로 추가합니다. 활성 구성표를 새 대상으로 설정하고이 구성표를 편집하십시오. 왼쪽의 Test를 선택하고 테스트 번들을 거기에 추가하십시오. 이제 Cmd-U로 응용 프로그램 테스트를 실행할 수 있습니다. – Felix

+0

시간을 내 주셔서 감사합니다. 내 구성표를 편집하고 테스트 섹션을 보면 내 CalculatorTests 번들이 올바르게 나열되어 있고 내가 정의한 테스트 클래스와 메서드가 표시됩니다. 분명한 것은 : 나는 이미 Cmd-U로 유닛 테스트를 할 수있다. 총 38 개의 어설 션을 포함하는 11 가지 테스트 방법이 있으며, 모두 올바르게 작동합니다 ...이 경우를 제외하고. 제대로 구성된 테스트 대상이 없으면 내 질문에 붙여 넣은 NSLog() 메시지를 실행할 수 있습니까? – pohl

1

로그 아웃 시도 시작 지점

+0

친절한가요? 0 회원입니까? 0 – pohl

+1

시도'[appDelegate class] == [CalculatorAppDelegate class]'please –

+1

좋은 생각. 출력은 NSLog (@ "% i", [appDelegate class] == [CalculatorAppDelegate class]), " – pohl