Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用CompletionHandler进行单元测试OpenWithHandler_Ios_Ios5_Objective C Blocks - Fatal编程技术网

Ios 如何使用CompletionHandler进行单元测试OpenWithHandler

Ios 如何使用CompletionHandler进行单元测试OpenWithHandler,ios,ios5,objective-c-blocks,Ios,Ios5,Objective C Blocks,我有一个源自SenTestCase的单元测试模块。我希望有一个单元测试方法,可以加载我以前保存在应用程序沙箱中的UIDocument派生文档。注意:此测试是关于本地加载文档(未配置iCloud)。我知道openWithCompletionHandler是异步运行的,所以我知道一旦测试函数从堆栈中运行,这就永远不会起作用。下面给出的代码表明了我的意图(当然不起作用): 我的问题是,有没有办法在单元测试框架内测试openWithCompletionHandler?我不介意是否必须在一段代码中同步运行

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

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


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

那么解决办法是什么呢?我们自己提供一个run循环,并让它一直运行,直到调用该块为止。我们使用在完成块中设置的
\u块
变量来查看何时可以停止运行运行循环

-(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];
    }
}

我现在认为有更好的方法来实现这一点。我意识到我真正想要的是测试contentsForType和loadFromContents。因此,在我的测试套件中,我将创建一个从MyDocument派生的模拟类,该类将实现saveToUrl和openWithCompletionHandler,它将简单地将contentsForType和loadFromContents调用同步重定向到MyDocument。如果您的目的是测试这些方法中的数据处理,那么处理异步文件i/o就没有意义了。如果这解决了我的问题,那么我会来更新这个问题。我创建了一个内存映射UIDocument派生类和一个NSMutableData派生类,在其中我包装了实现NSCoding协议的数据类。我起草了几个代表团。但它不起作用。我必须继续我的项目,所以我放弃了单元测试。如果你能指出更好的策略,请这样做。我仍然有兴趣知道。很抱歉回复太晚,非常感谢@redlightbulb
-(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];
    }
}