如何刷新TableViewCells

时间:2017-10-13 09:32:52

标签: ios objective-c uitableview unit-testing xcode8

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

初​​始化:

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

然后我设置了一些东西并致电:

[subject: viewWillAppear:NO];

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

在某些测试中,我必须添加:

[subject.view layoutIfNeeded];

然后它起作用了。

但是在当前的测试中,我添加了一个新的tableViewRow,它具有在运行时调用的相同方法。但我无法通过测试来重新加载UITableView以创建新的行和单元格,以便对其进行测试。

建议

Here使用:

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

有效。但有时它会崩溃。不只是一次测试失败,而且崩溃了运行单元测试的过程。所以所有其他测试都没有运行到最后。我无法将不稳定的代码推送到客户的回购中,因此这不是一个选择...

我正在使用XCode 8.3.3,如果这是相关的。

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

1 个答案:

答案 0 :(得分:0)

好的,这是我的错。我有

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

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

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