如何刷新TableViewCells



我在一个更大的项目中使用Cedar框架进行单元测试。我正在为一个包含UITableView的视图编写单元测试。

初始化:

subject = [[ControllerWithTableView alloc] initWithParams:params];
navigationController = [[UINavigationController alloc] initWithRootViewController:subject];

然后我设置了一些东西并调用:

[subject: viewWillAppear:NO];

在测试中,我可以在indexPaths等处要求单元格。这背后的主要思想是,它运行时不会让UI有太多时间进行设置。

在一些测试中,我不得不添加:

[subject.view layoutIfNeeded];

然后就起作用了。

但在当前的测试中,我使用运行时调用的相同方法添加了一个新的tableViewRow。但我无法让测试重新加载UITableView来创建新行和单元格,从而对其进行测试

这里建议使用:

#define tickRunLoop (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.01, false))

它有效。但有时它会崩溃。不仅一个测试失败,而且会破坏单元测试的运行过程。因此,所有其他测试都不会运行到底。我不能将不稳定的代码推送到客户的回购中,所以这不是一种选择。。。

如果相关的话,我使用XCode 8.3.3。

我还能做些什么来强制刷新?

好吧,这是我的错。我有

dispatch_async(dispatch_get_main_queue(), ^{
// stuff
});

在我的代码中(或者至少在项目中。它不是我的代码:p)。因此,该测试比本应测试的代码的执行速度更快。总是要小心异步的东西!

在所有情况下,[subject.view layoutIfNeeded];现在就足以强制刷新。

最新更新