您好,欢迎来到时间财富网
全部需求分类
当前位置:首页 > 移动应用 > ios开发:如何编写单元测试验证程序
ios开发:如何编写单元测试验证程序
2015/10/12 15:04:27   作者:风雨考验   人气:366次  评论(0)
所属标签: IOS 
现在很多人在开发iOS时都使用ReactiveCocoa,它是一个函数式和响应式编程的框架,使用Signal来代替KVO、Notification、Delegate和Target-Action等传递消息和解决对象之间状态与状态的依赖过多问题。但很多时候使用它之后,如何编写单元测试来验证程序是否正确呢?下面首先了解MVVM架构,然后通过一个例子来讲述我如何在RAC(ReactiveCocoa简称)中使用Kiwi来编写单元测试。 

MVVM架构 

 

在MVVM架构中,通常都将view和view controller看做一个整体。相对于之前MVC架构中view controller执行很多在view和model之间数据映射和交互的工作,现在将它交给view model去做。 

至于选择哪种机制来更新view model或view是没有强制的,但通常我们都选择ReactiveCocoa。ReactiveCocoa会监听model的改变然后将这些改变映射到view model的属性中,并且可以执行一些业务逻辑。 

举个例子来说,有一个model包含一个dateAdded的属性,我想监听它的变化然后更新view model的dateAdded属性。但model的dateAdded属性的数据类型是NSDate,而view model的数据类型是NSString,所以在view model的init方法中进行数据绑定,但需要数据类型转换。示例代码如下: 
Java代码 
  1. RAC(self,dateAdded) = [RACObserve(self.model,dateAdded) map:^(NSDate*date){   
  2.     return [[ViewModel dateFormatter] stringFromDate:date];  
  3. }];  

ViewModel调用dateFormatter进行数据转换,且方法dateFormatter可以复用到其他地方。然后view controller监听view model的dateAdded属性且绑定到label的text属性。 
Java代码 
  1. RAC(self.label,text) = RACObserve(self.viewModel,dateAdded);    

现在我们抽象出日期转换到字符串的逻辑到view model,使得代码可以测试和复用,并且帮view controller瘦身。 

登录情景 

 

如图所示,这是一个简单的登录界面:有用户名和密码的两个输入框,一个登录按钮。用户输入完用户名和密码后,点击登录按钮后,成功登录。但这里有限制条件:用户名必须满足邮件的格式和密码长度必须在6位以上。当同时满足这两个条件后才能点击按钮,否则按钮是不可点击的。大家可以从Github中下载实例代码。 

首先我们先画界面,我定义一个LoginView,将画登录界面的责任都交给它。然后在LoginViewController中的viewDidLoad方法调用buildViewHierarchy加载它。 
Java代码 
  1. #pragma mark - Lifecycle  
  2. - (void)viewDidLoad {  
  3.     [super viewDidLoad];  
  4.   
  5.     // build view hierarchy  
  6.     [self buildViewHierarchy];  
  7.     // bind data  
  8.     [self bindData];  
  9.     // handle events  
  10.     [self handleEvents];  
  11. }  
  12.   
  13. - (void)buildViewHierarchy  
  14. {  
  15.     [self.view addSubview:self.rootView];  
  16.     [self.rootView mas_makeConstraints:^(MASConstraintMaker *make) {  
  17.         make.edges.equalTo(self.view);  
  18.     }];  
  19. }  

接下来我们要思考UI如何交互和如何设计和实现哪些类来处理。由于用户名和密码要同时满足验证格式时才能点击登录按钮,所以需要时刻监听usernameTextField和passwordTextField的text属性,对于处理UI交互、数据校验以及转换都交给MVVM架构中ViewModel来处理。于是定义一个LoginViewModel,并继承RVMViewModel,这个RVMViewModel有个active属性来表示viewModel是否处于活跃状态,当active是YES时,更新或显示UI。当active是NO时,不更新或隐藏UI。 
J
引用

如果有些朋友对controller如何管理view生命周期不了解,可以阅读View Controller Programming Guide for iOS文档中的A View Controller Instantiates Its View Hierarchy When Its View is Accessed章节。 


 

图:Loading a view into memory from Apple Document


时间财富网为广大企业、商家、个人,提供平面设计、装修设计、建筑设计、起名改名、策划文案、网站建设、营销推广等服务。若您有类似需要,请点击立即发布项目

另,时间财富网上也有着各式各样的任务,无论您是拥有技能的专业人士,还是技术小白。都能在时间财富网上找到您能参与的项目。点击进入悬赏大厅

无论你有什么疑难杂症,威客们都能一一为您解决,点击进入:问答平台