单元测试 iOS 应用同步逻辑



我最近采用了一个iOS企业应用程序,它充当媒体CMS的客户端。 换句话说,Web 应用程序管理视频、图像幻灯片放映和静态/离线 HTML 文件的目录。 iOS 应用连接到 Web 应用,并将此内容下载到自身以供脱机使用。

热点是 iOS 和 Web 应用程序之间的同步逻辑。 对这两个项目之间的逻辑进行单元测试有什么建议吗?

是的,你必须"欺骗"一些。 一种方法是使用NSRunLooprunUntilDate:方法,这就是我的方法。

基本上,为了让你的 Web 代码有机会与 Web 通信,你希望将单元测试置于一种忙碌的等待状态,实际上让每个人都做一些工作,但你也希望定期在单元测试中"检查"以查看你的操作是否完成。

这是我的"去做工作"的方法:

-(BOOL)runLooperDooper:(NSTimeInterval)timeoutInSeconds{
    NSDate* giveUpDate = [NSDate dateWithTimeIntervalSinceNow:timeoutInSeconds];
    // loop until the operation completes and sets stopRunLoop = TRUE
    // or until the timeout has expired
    // stopRunLoop is a instance variable of the UnitTest object... take care to reset at the start or end of each test!
    while (!stopRunLoop && [giveUpDate timeIntervalSinceNow] > 0) 
    {
        // run the current run loop for 1.0 second(s) to give the operation code a chance to work
        NSDate *stopDate = [NSDate dateWithTimeIntervalSinceNow:1.0];
        [[NSRunLoop currentRunLoop] runUntilDate:stopDate];
    }
    return stopRunLoop;
}

因此,在每个单元测试中:

   NSTimeInterval testSpecificTimeout = 60; //60 seconds or however long you need...
   [self runLooperDooper:testSpecificTimeout]; 
   STAssertTrue(stopRunLoop, @"Failed to complete before runloop expired after %f seconds", timeoutInSeconds);

然后,我还为我的 Web 代码注册了一些事件处理程序,通过将 stopRunLoop ivar 设置为 TRUE 来知道它的操作何时完成。

最新更新