Objetivo C - Teste de unidade dispatch_async block?

Eu li outras mensagens que surgem com soluções para esta questão. No entanto, suas soluções exigem que o código hacky seja adicionado ao meu aplicativo para poder testá-lo. Para mim, código limpo é mais importante que o teste de unidade.

Eu uso o dispatch_async no meu aplicativo regularmente, e estou tendo problemas para testá-lo. O problema é que o bloco é executado depois que meu teste já está feito, já que ele está sendo executado de forma assíncrona na fila principal. Existe uma maneira de esperar até que o bloco seja executado e continuar com o teste.

Eu não quero passar uma conclusão para o bloco apenas por causa do teste de unidade

- (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