假如单元测试中想测试如下这段代码,你会发现在测试代码处大断点,断点根本不会停留。所以针对异步代码测试,并不能像常规的代码测试那样直接通过断言直接就测试了。因为苹果的单元测试时串行的,即所有测试都是顺序进行的,中间不会等待异步回调的完成,自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];
}