当测试从故事板加载的UITableViewController子类时,cellForRowAtIndexPath将返回nil ,除非我:A)发送它viewWillAppear:YES或B)获取tableView.numberOfSections。
这是为什么?为什么不在主线程上访问视图或发送loadView选择器呢?
SpecBegin(CustomerViewController)
describe(@"CustomerViewController", ^{
__block CustomerViewController *_vc;
beforeEach(^{
NSLog(@"Before Each");
UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"Storyboard_Pad" bundle:nil];
_vc = (CustomerViewController *)[mainstoryboard instantiateViewControllerWithIdentifier:@"customer"];
});
it(@"the first cell should be the fullName cell", ^{
// Following line is needed to make the following tests pass.
[_vc viewWillAppear:YES];
UITableViewCell *cell = [_vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
expect(cell.reuseIdentifier).to.equal(@"fullName");
});
});
SpecEnd
答案 0 :(得分:1)
看起来你是单元测试UI代码。我通常建议不要这样做,因为您将手动尝试模拟ViewController生命周期方法,以便关闭以重现您的UI在正在运行的应用程序中的行为。
我建议尝试两件事:
答案 1 :(得分:0)
事实证明,使用视图控制器方法可以直接在表视图对象上工作,但不能直接使用方法。通过视图控制器执行此操作时,无需调用viewWillAppear
。
这有效:
[_vc tableView:_vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
这不是
[_vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];