Ecco Apple's description di supporto nativo per il test asincrona.
TL; manuale DR:
Guarda XCTextCase+AsynchronousTesting.h
C'è di classe speciale XCTestExpectation
con un solo metodo pubblico: - (void)fulfill;
Si dovrebbe init un'istanza di questa classe e, in caso di chiamata di successo Metodo fulfill
. In caso contrario, il test fallirà dopo timeout che si specifica in che modo:
- (void)waitForExpectationsWithTimeout:(NSTimeInterval)timeout handler:(XCWaitCompletionHandler)handlerOrNil;
Esempio:
- (void)testAsyncMethod
{
//Expectation
XCTestExpectation *expectation = [self expectationWithDescription:@"Testing Async Method Works Correctly!"];
[MyClass asyncMethodWithCompletionBlock:^(NSError *error) {
if(error)
NSLog(@"error is: %@", error);
else
[expectation fulfill];
}];
//Wait 1 second for fulfill method called, otherwise fail:
[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
if(error)
{
XCTFail(@"Expectation Failed with error: %@", error);
}
}];
}
thanx ..è davvero aiutato –
Per coloro che hanno problemi con l'approccio del ciclo di esecuzione: non funzionerà correttamente: il metodo 'runMode: beforeDate:' non verrà restituito fino a dopo l'elaborazione dell'evento di una sorgente.Questo potrebbe non succedere mai (a meno che il test unitario non lo faccia esplicitamente nel gestore del completamento in qualche modo);) – CouchDeveloper
Ho usato la combinazione della tua soluzione con una Notifica che è già stata chiamata al termine del mio metodo. Grazie! –