Objective c OCUnit应用程序测试:尝试测试UIPageControl numberOfPages==NSArray计数

Objective c OCUnit应用程序测试:尝试测试UIPageControl numberOfPages==NSArray计数,objective-c,ios,ocunit,ocmock,Objective C,Ios,Ocunit,Ocmock,我对OCUnit和OCMock比较陌生,所以请容忍我。我有一个视图控制器,它包含一个UIPageControl,其中页数是根据NSArray的计数(由核心数据填充)计算的。这在ViewDidLoad方法中完成,如下所示: - (void)ViewDidLoad { [super viewDidLoad]; ... other code ... self.pageControl.numberOfPages = [self.viewedPages count];

我对OCUnit和OCMock比较陌生,所以请容忍我。我有一个视图控制器,它包含一个UIPageControl,其中页数是根据NSArray的计数(由核心数据填充)计算的。这在ViewDidLoad方法中完成,如下所示:

- (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], @"...");
}
然而,正如前面提到的,这个过程依赖于使用一个包含核心数据对象的数组,所以我决定在OCMock上尝试用一个预加前缀的数组来代替它,以有效地删除核心数据元素。这样做,我现在得到了我不理解的结果

下面是我的新测试的样子:

- (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上似乎真的缺少适合初学者学习的iPhone开发文档,不幸的是,这个小问题已经让我疯狂了两天了


提前感谢您的
控制器。pageControl
很可能为零。这可能是因为它没有连接到IBOutlet或以其他方式初始化,或者是因为您的单元测试实际上没有在应用程序可执行文件中运行。查看中的步骤并检查您的设置

或者,您可以模拟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];
}

您已经在
mock
中对控制器进行了模拟,但您仍然在
控制器上操作,它们是两个不同的对象。谢谢Paul。不过我还是有点困惑&我希望您能够详细说明一下,因为如果它们是两个不同的对象,我不明白为什么控制器viewedPages计数与我为模拟对象设置的(新)计数匹配?没有创建mock,我有两条记录。当我模拟对象并swizzle loadViewedPages方法时,控制器和模拟都会显示三条记录,如果它们是不同的对象,我会感到惊讶。再说一次,这肯定是我的一个误解,我发现的文档对我没有帮助。干杯我刚刚尝试了以下方法,但仍然得到相同的结果
[mock viewDidLoad];NSLog(@“%d”,[[mock pageControl]numberOfPages]);NSLog(@“%d”,[[模拟厨师]计数])对此非常困惑,非常感谢您的帮助非常感谢-这正是我在早上很早的时候为了通过测试而采取的方法!然而,我也最终使用statsertTrue(正如我发布的原始方法一样)运行了测试。为了实现这一点,我在测试函数中创建了一个UIPageControl的本地实例,并对控制器进行了裁剪,以使用本地PageControl而不是控制器中的PageControl。一旦我有了这些,所有的计数都是正确的。(我曾试图用OCMock版本替换它,但结果证明我只需要创建一个真正的本地版本!)