2013-10-22 11 views
6

Ich teste einen Teil meines Codes mithilfe von XCTest, die auch NSOperationen in der Hauptwarteschlange hinzufügt. Es sieht wie folgt aus:Verwenden von [NSOperationQueue mainQueue] in XCTests

[NSOperationQueue mainQueue] addOperationAsBlock:^{ // some code happens here }];

Der Code wird ausgeführt, wenn die App auf einem Gerät oder im Simulator läuft, aber überhaupt nicht ausgeführt werden, wenn das Gerät Test läuft (ich kann nicht an den Debug erhalten zeigen Sie auf die erste Zeile des Blocks).

calling:

[NSOperationQueue mainQueue] waitUntilAllOperationsAreFinished];

nicht so gut hilft.

Irgendwelche Vorschläge? Ich denke, dass mir ein Code fehlt, um die Warteschlange zu initialisieren.

* EDIT *

Vielen Dank für Ihre Antworten, ich meinen resultierenden Code für Vollständigkeit hinzugefügt:

// add as many operations as you'd like to the mainQueue here 
__block BOOL continueCondition = YES; 
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    // this should be the last operation 
    continueCondition = NO; 
}]; 
while (continueCondition) { 
    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
} // continue your test here 

Das funktioniert, weil die mainQueue garantiert nicht gleichzeitig, so dass die letzte Operation sein, das ist hinzugefügt wird der letzte ausgeführt - auf diese Weise müssen Sie nicht einmal Ihren Code ändern, um die Testschleife zu stoppen.

+0

Siehe http://stackoverflow.com/questions/12463733/objective-c-unit-testing-dispatch-async-block –

+0

Re; deine Bearbeitung zu Kazukis Antwort (von der ich sehe, dass du deine Meinung geändert hast). Wenn Sie möchten, dass Sie diesen Inhalt verwenden, um Ihre eigene Antwort hinzuzufügen, einschließlich des Codes, den Sie verwendet haben, warum er funktioniert usw. –

+0

Idealerweise würde eine solche Antwort jedoch eher in eine Antwortbox als in die Frage selbst eingehen; Klicken Sie auf die Schaltfläche "Eigene Frage beantworten" –

Antwort