Oto Apple's description natywnego wsparcia dla testów asynchronicznym.
TL; DR instrukcja:
Spójrz na XCTextCase+AsynchronousTesting.h
Istnieje specjalna klasa XCTestExpectation
z tylko jedną metodę publiczną: - (void)fulfill;
Należy Init wystąpienie tej klasy i sukcesu przypadku połączenia Metoda fulfill
. W przeciwnym razie próba nie powiedzie się po limitu czasu, aby określić, w tej metodzie:
- (void)waitForExpectationsWithTimeout:(NSTimeInterval)timeout handler:(XCWaitCompletionHandler)handlerOrNil;
Przykład:
- (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 ..To naprawdę pomogło –
dla tych, którzy mają problemy z podejściem pętli run: nie będzie działać poprawnie: the metoda 'runMode: beforeDate:' nie powróci, dopóki nie zostanie przetworzone zdarzenie źródłowe.To może się nigdy nie zdarzyć (chyba że test jednostkowy jawnie wykona to w instrukcji obsługi zakończenia);) – CouchDeveloper
Użyłem kombinacji twojego rozwiązania z powiadomieniem, które jest już wywoływane na końcu mojej metody. Dzięki! –