ios开发iOS精品文章-单元测试iOS dev

iOS 单元测试--异步测试

2016-05-28  本文已影响1802人  爱自由鹏

单元测试分为3种:


本节在 iOS 单元测试--逻辑测试 这篇文章的基础上,来介绍异步测试。直接在已创建好的Person这个类里,增加一个模拟“异步加载个人数据”的网络请求数据方法:

+ (void)loadPersonAsync:(void(^)(Person *person))completion; //异步加载个人数据

异步加载个人数据方法的单元测试.png

Person.m文件:

/** 异步加载个人记录 */
+ (void)loadPersonAsync:(void (^)(Person *))completion {
    
    // 异步 子线程执行
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        // 模拟网络延迟 2s
        [NSThread sleepForTimeInterval:2.0];
        
        Person *person = [Person personWithDict:@{@"name":@"zhang", @"age":@25}];
        
        // 回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            if (completion != nil) {
                completion(person);
            }
        });
    });
}

然后,切换到PersonTests.m,新建一个 - (void)testLoadPersonAsync{} 异步测试方法,然后Command+S保存,左边会出现菱形白色调试按钮。
测试中,要用到系统提供的XCTestExpectation这个类,以及- (void)waitForExpectationsWithTimeout:(NSTimeInterval)timeout handler:(nullable XCWaitCompletionHandler)handler这个方法来测试,测试代码如下所示:

调试的PersonTests.m文件:

// 测试异步加载person
- (void)testLoadPersonAsync {
    
    XCTestExpectation *expectation = [self expectationWithDescription:@"异步加载 Person"];
    
    [Person loadPersonAsync:^(Person *person) {
//        NSLog(@"%@",person);
        
        XCTAssertNotNil(person.name, @"名字不能为空");
        XCTAssert(person.age > 0, @"年龄不正确");
        
        // 标注预期达成
        [expectation fulfill];
    }];
    
    // 等待 5s 期望预期达成
    [self waitForExpectationsWithTimeout:5 handler:nil];
}

最后,通过AFNetworking的单元测试可以看出,它就是这样来进行异步测试的,附一张截图,大家可以把AFNetworking下载下来,自己研究一下。

AFNetworking的单元测试.png
上一篇下一篇

猜你喜欢

热点阅读