在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 }]; }
希望这个帮助