2017-10-13 3 views
0

Ich bin in einem größeren Projekt, das das Cedar-Framework für Komponententests verwendet. Ich schreibe Komponententests für eine Ansicht, die ein UITableView enthält.So aktualisieren Sie TableViewCells

Initialisierung:

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

Dann habe ich einige Dinge auf und rufen:

[subject: viewWillAppear:NO]; 

Im Test I für Zellen bei indexPaths fragen usw. Die Idee dahinter ist, dass es läuft, ohne dass die UI viel Zeit für die Einrichtung hat.

In einigen Tests hatte ich hinzufügen:

[subject.view layoutIfNeeded]; 

und dann es funktionierte.

Aber im aktuellen Test bin ich ein neues tableViewRow mit der gleichen Methode hinzufügen, die während der Laufzeit aufgerufen wird. Aber ich kann den Test nicht dazu bringen, das UITableView neu zu laden, um die neue Zeile und Zelle zu erstellen und sie zu testen.

Here ist die Verwendung vorgeschlagen:

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

Es funktioniert. Aber manchmal stürzt es ab. Nicht nur, dass ein Test fehlschlägt, sondern auch die Ausführung der Komponententests abgebrochen wird. Alle anderen Tests laufen also nicht bis zum Ende. Ich kann nicht instabilen Code zum Repo des Kunden drücken, so dass das keine Option ist ...

Ich verwende XCode 8.3.3, wenn das relevant ist.

Was kann ich noch tun, um eine Aktualisierung zu erzwingen?

Antwort

0

Okay, es war meine Schuld. Ich hatte

in meinem Code (oder zumindest im Projekt. Es war nicht mein Code: P). Der Test war also schneller als die Ausführung des Codes, der getestet werden sollte. Sei immer vorsichtig mit asynchronen Sachen!

In allen Fällen genügt [subject.view layoutIfNeeded];, um eine Aktualisierung jetzt zu erzwingen.

Verwandte Themen