2011-12-12 52 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版本交换,但事实证明我只需要创建一个真正的本地!) –