在unit testing中,使用dispatch_asyc执行队列中传递的块

如果我dispatch_async队列上的一块像这样:

 -(void) myTask { dispatch_async(dispatch_get_main_queue(), ^{ [self.service fetchData]; }); } 

在unit testing中,我可以通过手动运行主循环来执行主队列中传递的块:

 -(void)testMyTask{ // call function under test [myObj myTask]; // run the main loop manually! [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; // now I can verify the function 'fetchData' in block is called ... } 

现在,我有另一个类似的function,将块分派到主队列以外的连续队列:

 -(void) myTask2 { dispatch_async(dispatch_queue_create("my.sequential.queue", NULL), ^{ [self.service fetchData]; }); } 

在unit testing中,我该如何手动执行该块?

 -(void)testMyTask2{ // call function under test [myObj myTask2]; // How to manually execute the block now? } 

===澄清===

我想手动执行的原因是因为我不喜欢任何Wait-For-Timeout方式进行testing。 由于等待时间取决于CPU速度,因此在不同的机器上可能会有所不同。 我想手动执行传递给队列的块(就像我为主队列testing用例所做的那样),然后validation结果。

你可以在testing函数中创build队列。

 -(void) myTask2:(dispatch_queue_t*)queue { dispatch_async(*queue, ^{ [self.service fetchData]; }); } -(void)testMyTask2{ dispatch_queue_t queue = dispatch_queue_create("my.sequential.queue", NULL); [myObj myTask2:&queue]; dispatch_sync(queue, ^{ }); } 

(刚刚实现currentRunLoop是不需要的)

要在asynchronous块中执行testing,请使用XCTestExpectation

 -(void) myTask2 { XCTestExpectation *expectation = [self expectationWithDescription:@"catch is called"]; dispatch_async(dispatch_queue_create("my.sequetial.queue", NULL), ^{ [self.serviceClient fetchDataForUserId:self.userId]; [expectation fulfill]; }); [self waitForExpectationsWithTimeout:Timeout handler:^(NSError *error) { //check that your NSError nil or not }]; } 

希望这个帮助