2015-06-18 1 views
1

У меня есть XCTTestClass с асинхронным методом настройки. Это займет некоторое время (нужно разбирать файлы, вставлять их в bd и т. Д.), И я хочу убедиться, что мои тесты запускаются только после завершения этой настройки.Выполнение тестов после завершения асинхронного метода setUp

Как я могу это сделать?

ответ

2

Вы можете использовать семафоры, чтобы подождать, пока не получите результаты от вашего асинхронного вызова.

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
// Do your async call here 
// Once you get the response back signal: 
[self asyncCallWithCompletionBlock:^(id result) { 
    dispatch_semaphore_signal(semaphore); 
}]; 
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
0

В вашем использовании -setup метод либо семафор, как указано выше, или использовать dispatch_group. dispatch_group - мой предпочтительный подход.

@implementation XCTTestSubClass() 
{ 
    dispatch_group_t _dispatchGroup; 
} 
@end 

-(id)init 
{ 
    _dispatchGroup = dispatch_group_create(); 
    return [super init]; 
} 

-(void)setup 
{ 
    dispatch_group_async(_dispatchGroup, dispatch_get_current_queue(), ^{ 
     //your setup code here. 
    }); 
} 

Затем переопределить -invokeTest и убедитесь, что группа блоков (настройка) выполняется работает.

-(void)invokeTest 
{ 
    dispatch_group_notify(group, dispatch_get_current_queue(), ^{ 
     [super invokeTest]; 
    }); 
} 

Это гарантирует, что тесты будут работать только после того, как -setup завершена.