如果我dispatch_async
这样上主队列块:在单元测试中,执行队列中通过与dispatch_asyc块
-(void) myTask {
dispatch_async(dispatch_get_main_queue(), ^{
[self.service fetchData];
});
}
在单元测试中,我可以执行块在主队列通过手动传递运行主循环是这样的:
-(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
...
}
现在,我有一个调度块的顺序排队比主队列之外的其它类似的功能:
-(void) myTask2 {
dispatch_async(dispatch_queue_create("my.sequential.queue", NULL), ^{
[self.service fetchData];
});
}
在单元测试中,我该如何手动执行块?
-(void)testMyTask2{
// call function under test
[myObj myTask2];
// How to manually execute the block now?
}
===澄清===
我为什么要手动执行的原因是因为我不喜欢任何等待换超时方式做测试。由于等待时间取决于CPU速度,因此在不同的机器上可能会有所不同。我想手动执行传递给队列的块(与我为主队列测试用例所做的相同),然后验证结果。
什么正试图测试:网络请求或后台任务还是别的什么结果呢? 如果您需要测试异步调用,则存根'''self.service fetchData'立即调用并回调,然后您可以在这里使用''''waitForExpectationsWithTimeout'''解决方案。这不会花费很长时间。 – Konstantin
@Konstantin,它可能是任何东西,网络请求,后台任务等。这不是我的问题的重点。我只是想知道如何手动让队列执行块。这是我主要关心的问题。 –
我不认为这是可能的,除非您在测试函数中创建队列并将其传递。这可能不是你想要的。 – Code