- (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