我对 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 来说,似乎确实缺乏体面的文档供初学者学习,这个小问题已经让我发疯了两天......
先感谢您