【iOS】应用XCTest对异步任务进行单元测试
2016-07-11 09:29
603 查看
问题提出:
XCTest是xcode内置的单元测试框架,方便我们对那些不依赖UI的业务模块做单元测试,但是对于一些网络模块的异步调用,需要将测试模块的生命周期延长,等回调成功才释放。那么我们如体利用XCTest做异步单元测试呢?比如:如何对http网络接口做单元测试?
解决方案
由于XCTest是中只一个主线程,且并没有维护一个NSRunLoop,如果需要异步调用做单元测试,需要自己管理NSRunLoop更好的解决
GitHub大神已经很优雅的解决了这个问题https://github.com/mobilejazz-contrib/XCTest-Async
// // XCTest+Async.h // // Created by Saül Baró on 10/29/13. // Copyright (c) 2013 Wide Eyes Solutions SL. All rights reserved. // #import <XCTest/XCTest.h> #define ASYNC_TEST_START __block BOOL hasCalledBack = NO; #define ASYNC_TEST_DONE hasCalledBack = YES; #define ASYNC_TEST_END NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:10]; \ while (hasCalledBack == NO && [loopUntil timeIntervalSinceNow] > 0) { \ [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:loopUntil]; \ } \ if (!hasCalledBack) { XCTFail(@"Timeout"); } #define ASYNC_TEST_END_LONG_TIMEOUT \ NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:120]; \ while (hasCalledBack == NO && [loopUntil timeIntervalSinceNow] > 0) { \ [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:loopUntil]; \ } \ if (!hasCalledBack) { XCTFail(@"Timeout"); } @interface XCTest (Async) @end
如何使用
将 XTest+Async.h 这个分类头文件引入测试例类, 看下面的实例ASYNC_TEST_START 异步任务开始
ASYNC_TEST_DONE 异步任务完成
ASYNC_TEST_END 异步任务超时,10秒
ASYNC_TEST_END_LONG_TIMEOUT 设置异步任务超时时间,120秒
// 引入头文件 import "XCTest+Async.h" - (void)testExample { ASYNC_TEST_START; dispatch_queue_t kBgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(kBgQueue, ^{ NSData* repositoryData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://api.github.com/repos/mobilejazz/XCTest-Async"]]; NSError* error; if (repositoryData) { NSDictionary* repositoryInfo = [NSJSONSerialization JSONObjectWithData:repositoryData options:kNilOptions error:&error]; if (error) { XCTFail(@"The data was not a dictionary"); } else { XCTAssertNotNil(repositoryInfo, @"XCTest-Async repo:"); NSLog(@"Repos %@", repositoryInfo); } } else { XCTFail(@"The operation couldn't be completed"); } ASYNC_TEST_DONE; }); ASYNC_TEST_END; }
相关文章推荐
- 100 个最佳 Ubuntu 应用(中)
- 在 AppImage、Flathub 和 Snapcraft 平台上搜索 Linux 应用
- 24 个必备的 Linux 应用程序
- 注册表趣味应用小集
- 远程控制技术的应用
- 路由器访问列表的应用
- xDSL技术及其应用
- ruby实现的一个异步文件下载HttpServer实例
- C#异步绑定数据实现方法
- Ruby单元测试框架TestUnit的替代者MiniTest介绍
- 基于XML的桌面应用
- 科学知识:同步、异步、阻塞和非阻塞区别
- 探讨Ajax中同步与异步之间的区别
- SQL Server 2008 R2 应用及多服务器管理
- C#中异步回调函数用法实例
- Node.js 应用跑得更快 10 个技巧
- C#实现异步GET的方法
- C#异步下载文件
- C#异步执行任务的方法
- 简单实现C#异步操作