我在一个更大的项目中使用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,如果这是相关的。
我还可以做些什么来强制刷新?
答案 0 :(得分:0)
好的,这是我的错。我有
dispatch_async(dispatch_get_main_queue(), ^{
// stuff
});
在我的代码中(或至少在项目中。这不是我的代码:P)。 因此,测试比应该测试的代码的执行速度更快。一定要小心异步的东西!
在所有情况下,[subject.view layoutIfNeeded];
足以强制刷新。