2013-07-29 3 views
0

iOS 프로그래밍을위한 단위 테스트를 수행하고 있으며 조롱을 통해 기본 클래스의 유효성을 검사 할 때 약간의 문제가 발생했습니다. 자식 클래스를 OCMock을 사용하고 메인 클래스가 자식 컨트롤러 (mockObjects [uiviewContoller])를 추가하는지 확인한 다음 객체가 각 자식 컨트롤러의 메소드를 호출하는지 확인합니다.루트보기 컨트롤러 OCMockObject [UIViewController]를 자식보기 컨트롤러 오류로 추가

문제는 내가 점점 계속이다 "테스트에 실패 '루트 뷰 컨트롤러를 추가 OCMockObject [UIViewController에] 뷰 컨트롤러의 자식으로'"

내가 테스트를 실행할 때마다 다른 시간.

- (void)setUp 
{ 
    [super setUp]; 
    testMain = [[UIViewController alloc] init]; 
} 

- (void)tearDown 
{ 
    for (UIViewController *testCon in testMain.childViewControllers) { 
     [testCon removeFromParentViewController]; 
    } 
    testMain = nil; 
    [super tearDown]; 
} 

시험 :

- (void) testDayNightTriggerTriggersAllSubviews{ 
    id mockTopController = [OCMockObject niceMockForClass:[UIViewController class]]; 
    id mockBottomController = [OCMockObject niceMockForClass:[UIViewController class]]; 
    id mockMainScreen = [OCMockObject niceMockForClass:[UIViewController class]]; 

    [[mockTopController expect] dayNightTrigger]; 
    [[mockBottomController expect] dayNightTrigger]; 
    [[mockMainScreen expect] dayNightTrigger]; 

    //trigger 

    [testMain dayNightTrigger:mockTopController bottom:mockBottomController main:mockMainScreen]; 

    [mockBottomController verify]; 
    [mockTopController verify]; 
    [mockMainScreen verify]; 

} 

방법은 확인합니다 :

//overload 
- (void) dayNightTrigger:(UIViewController *) top bottom:(UIViewController *)bottom main:(UIViewController *)main{ 
    self.bottomMenu = bottom; 
    self.topMenu = top; 
    self.mainScreen = main; 
    [self dayNightTrigger]; 
} 
- (void) dayNightTrigger{ 
    [self.app dayNightTrigger]; 

    [self.bottomMenu dayNightTrigger]; 
    [self.topMenu dayNightTrigger]; 
    [self.mainScreen dayNightTrigger]; 
} 

내 설치/해체와 아무 잘못이 있는지 궁금 해서요? 또는 OCMock 프레임 워크에 문제가 있습니다.하지만 실제로이 오류가 계속 발생하는 이유는 무엇입니까?

+0

실제 추적을 붙여 넣는 것이 도움이 될 수 있습니다. –

+0

self.app dayNightTrigger를 조롱해야할까요? –

답변

3

동일한 문제가 발생했습니다. 귀하의 속성 bottomMenu, topMenu 및 mainScreen이 다른보기 컨트롤러의 하위보기 컨트롤러로 아래쪽, 위쪽 및 기본을 설정했다고 추측합니다.

불행히도 addChildViewController : UIViewController * 구조의 일부 값을 살펴 봅니다. 메서드 호출이 아닌 직접적인 메모리 액세스이기 때문에 OCMockObject는이를 가로 챌 수 없습니다. 결과적으로, mock 객체는 (때로는) 루트보기로 취급됩니다.

내가 주위 발견 방법은 addChildViewController을 무시했다 : 나는 테스트 파일에 테스트 한 그것은 아무것도하지 않은 개체에 :

@implementation MyViewController (overwriteForTesting) 
- (void)addChildViewController:(UIViewController *)childController { 
} 
@end 

이것은에 뷰 컨트롤러를 추가하지 않음을 의미 그래도 아이들의 목록.