Objetivo C - ¿Unidades de prueba dispatch_async block?

He leído otros mensajes que ofrecen soluciones a esta pregunta. Sin embargo, sus soluciones requieren que se agregue código hacky a mi aplicación para poder probarlo. Para mí, el código limpio es más importante que la prueba unitaria.

Uso dispatch_async en mi aplicación con regularidad, y tengo problemas con la unidad para probarlo. El problema es que el bloque se ejecuta después de que mi prueba ya haya finalizado, ya que se ejecuta de forma asíncrona en la cola principal. ¿Hay alguna forma de esperar de alguna manera hasta que se ejecute el bloqueo y luego continuar con la prueba?

NO quiero pasar una conclusión al bloque solo debido a la prueba de la unidad

- (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];
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta