gpt4 book ai didi

ios - 如何对打开 WithCompletionHandler 进行单元测试

转载 作者:行者123 更新时间:2023-11-28 17:35:16 26 4
gpt4 key购买 nike

我有一个源自 SenTestCase 的单元测试模块。我想要一个单元测试方法来加载我之前保存在应用程序沙箱中的 UIDocument 派生文档。请注意,此测试是关于在本地加载文档(未配置 iCloud)。我知道 openWithCompletionHandler 异步运行,所以我知道一旦测试函数从堆栈中运行,这将永远不会工作。给出以下代码以表明我的意图(当然它不起作用):

-(void)testLoadingDocument{
...
MyDocument *document = [[MyDocument alloc] initWithFileURL:destUrl];
STAssertNotNil(document, @"Document is nil");

NSLog(@"LOAD: %@", document.fileURL);
[document openWithCompletionHandler:^(BOOL success) {
NSLog(@"openWithCompletionHandler success = %@", success);
if (success) {
// document.packet will be filled by loadFromContents
STAssertNotNil(document.packet, @"document.packet is nil.");
}
}];
}

我的问题是真的有什么方法可以在单元测试框架内测试 openWithCompletionHandler 吗?我不介意是否必须在一段代码中同步运行整个文档加载操作。由于这是一个测试代码,我认为这与必须在设备上异步运行的代码不同,这是可以接受的。

非常感谢。

最佳答案

这个问题花了我一段时间才弄清楚。我喜欢单元测试,但是当使用 SenTestCase 时,您的测试不会在与常规代码相同的环境中运行。最重要的是,您缺少一个包含运行循环的主循环,这使得任何带有异步回调的东西都容易无所事事。

那么解决方案是什么?我们自己提供一个运行循环并让它运行直到 block 被调用。我们使用在完成 block 中设置的 __block 变量来查看何时可以停止运行运行循环。

-(void)testOfAsyncCallingMethod{

__block bool wasCalled = NO;

[testingObject methodThatRunsACompletionBlock:^{
wasCalled = YES;
}];

NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:10];
while (wasCalled == NO && [loopUntil timeIntervalSinceNow] > 0) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:loopUntil];
}
}

关于ios - 如何对打开 WithCompletionHandler 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9991566/

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