0

我对 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], @"...");
}

但是,如前所述,此过程依赖于使用包含 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 工作原理的误解,有人可以纠正我 - 我将永远感激!不幸的是,对于 iPhone 开发的 OCUnit 和 OCMock 来说,似乎确实缺乏体面的文档供初学者学习,这个小问题已经让我发疯了两天......

先感谢您

4

1 回答 1

1

controller.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];
}
于 2011-12-12T21:12:35.500 回答