Я копался в течение недели, чтобы найти решение этой проблемы, когда, наконец, поймал перерыв.Было немного странно, что рядом с вопросом о награде почти не было взглядов, и никто не пытался найти ответ.Я думал, что вопрос может быть глупым, но не было никаких отрицательных голосов, и никто не хотел исправить это также.Не стал ли StackOverflow настолько насыщенным?
Решение.
Хитрость заключается в том, чтобы не утверждать что-либо из метода обратного вызова, но вернуть утверждения обратно в исходный тест.Метод wait фактически блокирует поток, о котором я раньше не думал.Если ваш асинхронный обратный вызов получает какие-либо значения, просто сохраните их в ivar или свойстве, а затем сделайте утверждения на их основе в исходном методе тестирования.
Это заботится о подтверждениях, не вызывающих сбоев.
- (void)testAsyncOperation
{
[self prepare];
MyOperation *op = [[[MyOperation alloc] init] autorelease];
op.delegate = self; // delegate method is called on the main thread.
[self.operationQueue addOperation:op];
// The `waitfForStatus:timeout` method will block this thread.
[self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.0];
// And after the callback finishes, it continues here.
GHAssertTrue(NO, @"This triggers a failed test without anything crashing.");
}
- (void)didFinishAsyncOperation
{
[self notify:kGHUnitWaitStatusSuccess forSelector:@selector(testAsyncOperation)];
}