Ho letto altri post che presentano soluzioni a questa domanda. Tuttavia, le loro soluzioni richiedono l'aggiunta di un codice hacky alla mia applicazione per poterlo testare. Per me il codice pulito è più importante del test unitario.Objective C - Unità testando il blocco dispatch_async?
Uso dispatch_async nella mia app regolarmente e ho difficoltà a provarlo. Il problema è che il blocco viene eseguito dopo che il mio test è già stato eseguito, poiché è in esecuzione in modo asincrono sulla coda principale. C'è un modo per aspettare in qualche modo fino a quando il blocco viene eseguito e poi continuare con il test.
NON voglio passare un completamento al blocco solo a causa di unit test
- (viod)viewDidLoad
{
[super viewDidLoad];
// Test passes on this
[self.serviceClient fetchDataForUserId:self.userId];
// Test fails on this because it's asynchronous
dispatch_async(dispatch_get_main_queue(), ^{
[self.serviceClient fetchDataForUserId:self.userId];
});
}
- (void)testShouldFetchUserDataUsingCorrectId
{
static NSString *userId = @"sdfsdfsdfsdf";
self.viewController.userId = userId;
self.viewController.serviceClient = [[OCMockObject niceMockForClass:[ServiceClient class]];
[[(OCMockObject *)self.viewController.serviceClient expect] fetchDataForUserId:userId];
[self.viewController view];
[(OCMockObject *)self.viewController.serviceClient verify];
}
Utilizzando questo codice, il blocco non viene richiamato affatto, neanche dopo il test. – aryaxt
Ho rivisto la mia risposta. Ho testato questo approccio in modo più approfondito. –
Grazie. Questo metodo non sembra affidabile, ma non ho trovato una soluzione migliore, quindi andrò avanti e usarlo sperando che non rompa i miei test. – aryaxt