- (void)testAsync
{
NSDictionary * dict = @{
@"name": @"SindriLin",
@"age": @22,
@"flags": @987654321
};
LXDTestsModel * model = [[LXDTestsModel alloc] initWithDictionary: dict];
XCTAssertNotNil(model);
[model asyncConvertToData];
while (model.data == nil) {
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.01, YES);
NSLog(@"waiting");
}
XCTAssertNotNil(model.data);
NSLog(@"convert finish %@", model.data);
}
同样的,如果你的异步操作是网络请求,那么在执行的回调外对获取的数据类型加上__block修饰,然后判断这个获取的数据是否不为空来停止循环。另外最重要的是你必须在你的死循环中加入CFRunLoopRunInModel这个函数的调用来保证即便是在等待的情况下,你的主线程仍然能处理其他的事情。
__block BOOL complete = NO;
__block NSData * data = nil;
[network POST: @"http://xxxxxxx" parameters: nil completion: ^(NSData * receiveData) {
data = receiveData;
complete = YES:
}];
while (!complete) {
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.01, YES);
NSLog(@"requesting");
}
尾言
最开始笔者一度认为单元测试是个比较考验技术的东西,但恰恰相反的,单元测试的使用与概念是相当简单的一个东西,难点在于不知道怎么用,这就需要我们持续的使用练习才能更好的服务于我们的开发。此外,常用的第三方框架例如YYModel、AFNetworking、Alamofire等等优秀框架中也有对框架自身编写的单元测试,学习仿写这些单元测试也是快速提升自己的一种手段。
很多时候,我们的项目中难免发生多个类之间的交互处理,而这种操作非常的不好调试。单元测试的原则之一就在于我们用来测试的代码要求功能很单一,这其实与良好的代码设计的思想是非常相符的。一方面来说,良好的代码结构设计可以让我们的测试用例的构建更加快速简单;反过来单元测试逼着我们去想办法减少类之间的耦合以此来减少甚至排除测试的干扰。无论如何,如果你想成为更好的开发者,单元测试是我们快速提升代码认知的重要手段之一。
原文转自: http://www.cocoachina.com/ios/20160607/16612.html