2011-12-12 51 views
0

我對OCUnit和OCMock相對較新,請耐心等待。我有一個視圖控制器,它包含一個UIPageControl,其中頁數是從NSArray(從核心數據填充的)的計數中計算出來的。這在viewDidLoad方法如下進行:OCUnit應用程序測試:試圖測試UIPageControl numberOfPages == NSArray count

- (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]); 
} 

日誌顯示用於兩個viewedPages和numberOfPages匹配整數值,幸運如果我運行下面測試斷言爲真:

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

然而,如前所述,這個過程依賴於使用Core Data中的對象的數組,所以我決定嘗試使用OCMock來取代預先定義的數組,以便有效地刪除Core Data元素。這樣做,我現在得到的結果我不明白。

這是我的新的考驗是什麼樣子:(!偉大的)

- (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]; 
} 

什麼是困惑我的是,在這個場景中的NSLog表明viewedPages數相匹配,我創建模擬陣列的計數,但numberOfPages始終爲零?結果,測試失敗。

我還試圖混寫它加載在控制器中的viewedPages陣列的功能,與在測試控制器的本地函數返回一個預先定義的陣列,即,

[[[mock stub] andCall:@selector(createMockPageViews) onObject:self] loadPageViews]; 

然而,這有完全相同的與上面相同的結果。測試仍然失敗,因爲numberOfPages返回0,而ViewedPages數組顯示預期的計數。正如我所說,我是OCUnit和OCMock的新手,所以我希望這個問題儘可能詳細和有意義。我希望這是我的誤解,關於OCMock如何工作,哪些人可以糾正我 - 我會永遠感激!在OCUnit和OCMock for iPhone開發中,似乎真的缺乏體面的文檔,對於初學者來說不幸的是,這個小問題已經讓我生氣了兩天了...

先謝謝您

+0

你已經做了你的控制器的模擬中'mock',但你在你的'controller'仍在運行,他們是兩個不同的對象。 –

+0

謝謝保羅。我仍然有點困惑,希望你能詳細說明,因爲如果它們是兩個不同的對象,我不明白爲什麼控制器的ViewedPages count匹配我爲Mock對象設置的(新)計數?沒有創建模擬,我有兩個記錄。當我嘲笑對象並調整loadViewedPages方法時,控制器和模擬都會顯示三條記錄,如果它們是不同的對象,會令我感到意外。再次,這肯定會降低到我的誤解,我發現的文檔沒有幫助我。乾杯! –

+0

我剛剛試過以下,但結果仍然相同 '[mock viewDidLoad]; NSLog(@「%d」,[[mock pageControl] numberOfPages]); NSLog(@「%d」,[[mock chefs] count]);' 真的很困惑這個,並感謝任何幫助 –

回答

1

controller.pageControl是最有可能爲零。這可能是因爲它沒有連接到IBOutlet或以其他方式初始化,或者因爲您的單元測試實際上並未在應用程序可執行文件中運行。查看setting up your unit test target中的步驟並檢查您的設置。

或者,你可以嘲笑UIPageControl對象:

- (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版本交換,但事實證明我只需要創建一個真正的本地!) –