Cel C - Testowanie bloku dispatch_async?

Czytam inne posty, które zawierają rozwiązania tego pytania. Jednak ich rozwiązania wymagają dodania hackiego kodu do mojej aplikacji, aby móc ją przetestować. Dla mnie czysty kod jest ważniejszy niż test jednostkowy.

Używam dispatch_async w mojej aplikacji regularnie i mam problem z testowaniem go. Problem polega na tym, że blok jest wykonywany po zakończeniu mojego testu, ponieważ działa on asynchronicznie w głównej kolejce. Czy istnieje sposób, aby jakoś poczekać, aż blok zostanie wykonany, a następnie kontynuować test.

NIE chcę przekazywać ukończenia bloku tylko z powodu testów jednostkowych

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

questionAnswers(3)

yourAnswerToTheQuestion