2017-10-13 121 views
0

我在一個更大的項目中使用Cedar框架進行單元測試。我正在爲包含UITableView的視圖編寫單元測試。如何刷新TableViewCells

初始化:

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

好的,這是我的錯。我有我的代碼(或至少在項目中,這不是我的代碼:P)

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

。 因此,測試比應該測試的代碼的執行更快。一定要小心異步的東西!

在所有情況下[subject.view layoutIfNeeded];都足以強制刷新。