gpt4 book ai didi

ios - 在单元测试中,使用 dispatch_asyc 执行队列中传递的 block

转载 作者:行者123 更新时间:2023-11-29 11:58:41 25 4
gpt4 key购买 nike

如果我dispatch_async ma​​in 队列上的一个 block ,如下所示:

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

在单元测试中,我可以像这样手动运行主循环来执行主队列中传递的 block :

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

现在,我有另一个类似的函数,它将 block 分派(dispatch)到顺序队列而不是主队列:

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

在单元测试中,我现在如何手动执行 block ?

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

===澄清===

之所以要手动执行是因为我不喜欢任何Wait-For-Timeout的方式做测试。因为等待时间取决于 CPU 速度,所以在不同的机器上可能会有所不同。我想手动执行传递给队列的 block (与我对主队列测试用例所做的方式相同),然后验证结果。

最佳答案

您可以在测试函数中创建队列。

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

关于ios - 在单元测试中,使用 dispatch_asyc 执行队列中传递的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37992319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com