2011-12-12 2 views
0

OCUnit과 OCMock에 처음으로 익숙해졌습니다. 페이지 수를 NSArray (코어 데이터에서 채워집니다)의 수를 계산하는 UIPageControl 들어있는보기 컨트롤러가 있습니다. 이것은 다음과 같이있는 viewDidLoad 메소드에서 수행됩니다 viewedPages 및 numberOfPages 모두 정수 값을 일치OCUnit 응용 프로그램 테스트 : UIPageControl을 테스트하려고합니다 numberOfPages == NSArray 개수

- (void)ViewDidLoad { 
    [super viewDidLoad]; 

    ... other code ... 

    self.pageControl.numberOfPages = [self.viewedPages count]; 
    self.pageControl.currentPage = 0; 

    NSLog(@"%d", controller.pageControl.numberOfPages); 
    NSLog(@"%d", [controller.viewedPages count]); 
} 

로그 표시, 나는 아래의 테스트를 실행 다행히도 경우 주장은 사실이다 : 그러나

- (void)testPageControl { 
    [controller viewDidLoad]; 
    STAssertTrue(controller.pageControl.numberOfPages == [controller.viewedPages count], @"..."); 
} 

앞에서 언급했듯이이 프로세스는 코어 데이터의 객체를 사용하는 배열을 사용하기 때문에 코어 데이터 요소를 효과적으로 제거하기 위해 OCMock에서 사전 정의 된 배열로 대체하기로했습니다. 그렇게함으로써 나는 지금 이해하지 못하는 결과를 얻고있다. 여기

이처럼 내 새로운 테스트는 모습입니다 : (! 큰) 무엇 나를 혼란 것은이 시나리오에서 NSLog가 viewedPages 내가 만든 모의 배열의 수를 일치 계산 것을 알 수 있다는 것입니다

- (void)testPageControl { 
    id mock = [OCMockObject partialMockForObject:controller]; 
    NSArray *mockPagesArray = [NSArray alloc] initWithObjects:...]; 
    [[[mock stub] andReturn:mockPagesArray] viewedPages]; 

    [controller viewDidLoad]; 

    NSLog(@"%d", [controller.pageControl numberOfPages]); 
    NSLog(@"%d", [controller.viewedPages count]); 
    STAssertTrue(controller.pageControl.numberOfPages == [controller.viewedPages count], @"..."); 
    [mockPagesArray release]; 
} 

하지만, numberOfPages는 항상 0입니까? 결과적으로 테스트가 실패합니다.

는 또한,
[[[mock stub] andCall:@selector(createMockPageViews) onObject:self] loadPageViews]; 

그러나, 즉 미리 정의 된 배열을 반환 테스트 컨트롤러에서 로컬 함수와 컨트롤러의 viewedPages 배열을로드하는 기능을 스위 즐링 노력이 정확히 있었다 위와 같은 결과. numberOfPages가 0을 반환하기 때문에 테스트는 여전히 실패합니다. 반면에 viewedPages 배열은 예상 된 횟수를 보여줍니다.

은 내가 OCUnit 및 OCMock에 새로 온 사람, 그래서이 질문은 가능한 한 상세하고 의미가 희망 말했듯이. 나는 누군가가 나를 교정 할 수있는 OCMock이 어떻게 작동하는지에 대한 내 의견을 오해하고 있기를 바라고 있습니다 - 저는 영원히 감사 할 것입니다! 초보자를위한 OCUnit과 OCMock은 불행히도 배울 점이 없으며,이 작은 문제로 인해 이틀 동안 나를 미치게 만들었습니다 ...

미리 감사드립니다.

+0

당신은 mock''에서 컨트롤러의 실물 크기의 모형을 만들었습니다하지만 당신은 여전히'controller'에 운영하고 있습니다

또는, UIPageControl 개체를 조롱 할 수있다. –

+0

폴 감사합니다. 나는 아직도 약간 혼란 스럽다. & nbsp 두 개의 다른 객체 인 경우, 컨트롤러가 조회 한 Pages 개수가 Mock 객체에 대해 설정 한 (새로운) 개수와 일치하지 않기 때문에 당신이 정교 할 수 있기를 바랄까? 모의를 만들지 않고 나는 두 가지 기록을 가지고있다. 객체를 모의하고 loadViewedPages 메서드를 사용하면 컨트롤러와 모의 객체가 모두 서로 다른 객체 인 경우 나를 놀라게하는 세 개의 레코드를 표시합니다. 다시 말하지만, 이것은 분명히 내 부분에 대한 오해가 될 것이며, 발견 한 문서는 나를 도왔다. 건배! –

+0

방금 ​​다음과 같이 시도했지만 여전히 동일한 결과가 나타납니다. '[mock viewDidLoad]; NSLog (@ "% d", [[mock pageControl] numberOfPages]); NSLog (@ "% d", [요리사 수 계산]), 정말 혼란스럽고 도움이된다. –

답변

1

controller.pageControl은 거의없는 것 같습니다. 이는 IBOutlet에 연결되지 않았거나 초기화되지 않았거나 단위 테스트가 실제로 앱 실행 파일 내에서 실행되지 않았기 때문일 수 있습니다. setting up your unit test target의 단계를 살펴보고 설정을 확인하십시오. 그들은 두 개의 서로 다른 객체가

- (void)testPageControl { 
    id mockPageControl = [OCMockObject mockForClass:[UIPageControl class]]; 
    [[mockPageControl expect] setNumberOfPages:3]; 
    [[mockPageControl expect] setCurrentPage:0]; 

    id mock = [OCMockObject partialMockForObject:controller]; 
    NSArray *mockPagesArray = [NSArray alloc] initWithObjects:...]; 
    [[[mock stub] andReturn:mockPagesArray] viewedPages]; 
    [[[mock stub] andReturn:mockPageControl] pageControl]; 

    [controller viewDidLoad]; 

    [mockPageControl verify]; 
} 
+0

대단히 고마워요 .- 이것은 매우 이른 아침에 찍은 접근 방식입니다. 시험 합격! 그러나 또한 STAssertTrue를 사용하여 테스트를 마침내 얻을 수있었습니다 (원래 게시 한 방식대로). 이를 달성하기 위해 테스트 함수에 UIPageControl의 로컬 인스턴스를 만들고 컨트롤러에 스텁 대신 컨트롤러의 로컬 PageControl을 사용하도록 스텁했습니다. 내가 한 번 모든 계산은 정확하게 계산했다. (나는 그것을 OCMock 버전으로 바꾸려고했지만 순전히 현지의 정품을 만들어야했다.) –