iOS单元测试中的异步测试(三)

作者: ZhengYaWei | 来源:发表于2017-02-27 11:59 被阅读223次

    假如单元测试中想测试如下这段代码,你会发现在测试代码处大断点,断点根本不会停留。所以针对异步代码测试,并不能像常规的代码测试那样直接通过断言直接就测试了。因为苹果的单元测试时串行的,即所有测试都是顺序进行的,中间不会等待异步回调的完成,自Xcode6开始才提供了解决方法。

    + (void)loadZWToolsAsync:(void (^)(ZWTools *tools))completion{
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [NSThread sleepForTimeInterval:1.0];
            ZWTools *tools = [[ZWTools alloc]init];
            dispatch_async(dispatch_get_main_queue(), ^{
                if (completion != nil) {
                    completion(tools);
                }
            });
        });
    }
    
    

    异步测试的解决方案主要是通过添加标记的形式,去判断异步测试的完成。主要是借助XCTestExpectation这个类。如下是具体的代码,内部注释会说明具体是怎么添加标记的,告诉异步测试的完成。

    //异步加载ZWTools测试
    - (void)testLoadToolsAsync{
        //解决法方案:通过Exception
        XCTestExpectation *exception = [self expectationWithDescription:@"异步加载ZWTools"];
        [ZWTools loadZWToolsAsync:^(ZWTools *tools) {
            NSLog(@"异步测试%@",tools);
            //调用fulfill方法,标注预期完成
            [exception fulfill];
        }];
        //等待10s期待预期完成,10s之内完成任务就认为是正常的
        [self waitForExpectationsWithTimeout:10.0 handler:nil];
    }
    

    相关文章

      网友评论

        本文标题:iOS单元测试中的异步测试(三)

        本文链接:https://www.haomeiwen.com/subject/mzlzwttx.html