Ziel C - Unit Testing Dispatch_async Block?

Ich habe andere Beiträge gelesen, die Lösungen für diese Frage bieten. Für ihre Lösungen muss meiner Anwendung jedoch Hacky-Code hinzugefügt werden, um sie testen zu können. Für mich ist sauberer Code wichtiger als Unit-Test.

Ich verwende dispatch_async regelmäßig in meiner App und habe Probleme, das Gerät zu testen. Das Problem ist, dass der Block ausgeführt wird, nachdem mein Test bereits abgeschlossen ist, da er asynchron in der Hauptwarteschlange ausgeführt wird. Gibt es eine Möglichkeit, irgendwie zu warten, bis der Block ausgeführt wird und dann mit dem Test fortzufahren?

Ich möchte nicht nur wegen Unit-Tests eine Vervollständigung an den Block übergeben

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage