Leo otras publicaciones que ofrecen soluciones a esta pregunta. Sin embargo, sus soluciones requieren que se agregue código malicioso a mi aplicación para poder probarlo. Para mí, el código limpio es más importante que la prueba unitaria.Objetivo C: prueba unitaria dispatch_async block?
Uso dispatch_async en mi aplicación regularmente, y estoy teniendo problemas para probarlo. El problema es que el bloque se ejecuta después de que mi prueba ya está hecha, ya que se ejecuta de forma asíncrona en la cola principal. ¿Hay alguna manera de esperar de alguna manera hasta que se ejecute el bloque y luego continuar con la prueba?
NO deseo de pasar una terminación al bloque sólo a causa de la unidad de pruebas de
- (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];
}
Usando este código, el bloque no recibe ninguna llamada, ni siquiera después de que se realiza la prueba. – aryaxt
He revisado mi respuesta. Probé este enfoque más a fondo. –
Gracias. Este método no parece ser confiable, pero no he encontrado una mejor solución, así que lo usaré con la esperanza de que no rompa mis pruebas. – aryaxt