Ich versuche, meine asynchronen Unit-Tests zu aktualisieren, um die neue XCTestExpectation
Schnittstelle zu verwenden, anstatt die Laufschleife manuell zu drehen.iOS Unit Testing: Warten auf Zeitintervall mit Erwartungen
zuvor My Unit-Tests die Funktionen genutzt waitForBlock
, finishBlock
und waitForTimeInterval:
die einfach eine bequeme Methode ist, die finishBlock
nach der angegebenen Zeit aufgerufen. Ich versuche, dieses Setup zu aktualisieren, um die Erwartungen zu nutzen.
Die Tests, die waitForBlock
+ finishBlock
Semantik wurden unter Verwendung arbeiten alle nur nach wie erwartet mit waitForExpectationsWithTime:handler:
und fulfill
ersetzt werden, aber meine Lösung waitForTimeInterval:
ersetzen nicht zu funktionieren scheinen.
- (void)waitForTimeInterval:(NSTimeInterval)delay
{
XCTestExpectation *expectation = [self expectationWithDescription:@"wait"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[expectation fulfill];
});
[self waitForExpectationsWithTimeout:delay + 1 handler:nil];
}
Edit:
Scheint, wie dieser Code tatsächlich tut Arbeit ... so war dies wahrscheinlich nur Xcode 6 mit mir an diesem Nachmittag zu schrauben.
Ich fühle mich wie es recht sein sollte geradlinig: Eine Erwartung, einen asynchronen Block, der eingerichtet erfüllt ist, und warten. Der dispatch_after
-Block wird jedoch nie aufgerufen.
Meine Ahnung ist, dass waitForExpectationsWithTimeout:handler:
blockiert seinen aktuellen Thread, der die Hauptwarteschlange ist, so dass die RUN-Schleife nie um seine asynchronen Blöcke herumkommt. Das scheint vernünftig, aber ich habe Schwierigkeiten, eine andere Möglichkeit zu finden, diese Funktionalität zu implementieren.
Ich suche entweder 1) zusätzliche Informationen über XCTestExpectation
, die eine Problemumgehung aufdecken könnte, oder 2) eine andere Idee für die Implementierung dieser Funktionalität.
Neugierig, warum Sie es auf diese Weise tun, würden Sie nicht wollen, nicht die Erwartungen nach einiger vordefinierten Verzögerung erfüllen, sondern recht, wenn Ihre async Aufgaben abgeschlossen sind? – Mike
Auch der Code, den Sie zur Verfügung gestellt scheint scheint gut für mich ... https://www.dropbox.com/s/lj61uwpbznyruaq/Screenshot%202014-09-25%2022.43.36.png?dl=0 – Mike
1) Ich gebe Ihnen zu, dass die Notwendigkeit für diese Funktionalität ein bisschen ein Code-Geruch ist, aber einige unserer Hintergrundaufgaben sind Feuer-und-vergessen, ohne einen asynchronen Rückruf. In diesen Fällen stellen wir sicher, dass die Hintergrundaufgabe abgeschlossen wird, indem nur auf ein kleines Zeitintervall gewartet wird, bevor der resultierende Zustand verifiziert wird. – LeffelMania