Próbuję zaktualizować moje asynchroniczne testy jednostkowe, aby użyć nowego interfejsu XCTestExpectation
zamiast ręcznie obracać pętlę uruchamiania.Testowanie urządzenia iOS: oczekiwanie na interwał z oczekiwaniami
Moje testy jednostkowe wcześniej wykorzystywane funkcje waitForBlock
, finishBlock
i waitForTimeInterval:
który jest po prostu metoda zwana finishBlock
wygoda że po upływie określonego czasu. Próbuję zaktualizować tę konfigurację, aby wykorzystać oczekiwania.
Badania, które zostały z wykorzystaniem waitForBlock
+ finishBlock
semantykę są wszystko działa tak jak oczekiwano po zastąpiony waitForExpectationsWithTime:handler:
i fulfill
, ale moje rozwiązanie, aby zastąpić waitForTimeInterval:
nie wydaje się działać.
- (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:
Wydaje się, że kod faktycznie robi pracy ... więc był to prawdopodobnie tylko Xcode 6 przykręcania ze mną po południu.
czuję się jak powinno być dość prosta: Tworzenie oczekiwania, skonfigurować asynchroniczne blok, który spełnia się i czekać. Jednak blok dispatch_after
nigdy nie jest wywoływany.
Moje przeczucie polega na tym, że waitForExpectationsWithTimeout:handler:
blokuje bieżący wątek, który jest główną kolejką, więc pętla uruchamiania nigdy nie przechodzi do asynchronicznych bloków. Wydaje się to uzasadnione, ale mam problem z wymyśleniem innego sposobu wdrożenia tej funkcji.
Szukam 1) dodatkowych informacji o XCTestExpectation
, które mogą ujawnić obejście, lub 2) innego pomysłu na wdrożenie tej funkcji.
Ciekawe dlaczego robisz to w ten sposób, nie chcesz, aby nie spełnić oczekiwania po pewnym zdefiniowanym opóźnieniem, ale raczej w porządku, gdy zadania są zakończone asynchroniczny? – Mike
Również podany przez Ciebie kod działa dobrze dla mnie ... https://www.dropbox.com/s/lj61uwpbznyruaq/Screenshot%202014-09-252020.43.36.png?dl=0 – Mike
1) Zapewniam, że potrzeba tej funkcjonalności jest trochę zakodowana w kodzie, ale niektóre z naszych zadań w tle są zaporą i zapomnieniem, bez asynchronicznego wywołania zwrotnego. W takich przypadkach upewniamy się, że zadanie w tle kończy się po prostu czekając na mały przedział czasu przed sprawdzeniem stanu wynikowego. – LeffelMania