您好,欢迎来到时间财富网
全部需求分类
当前位置:首页 > 移动应用 > ios开发:如何编写单元测试验证程序
ios开发:如何编写单元测试验证程序
2015/10/12 15:04:27   作者:风雨考验   人气:475次  评论(0)
所属标签: IOS 
  • usernameTextField和passwordTextField一定要调用sendActionsForControlEvents方法来通知UI已经更新。

Java代码 
  1. [rootView.usernameTextField sendActionsForControlEvents:UIControlEventEditingChanged];  
  2. [rootView.passwordTextField sendActionsForControlEvents:UIControlEventEditingChanged];  

一开始时,我并没有调用sendActionsForControlEvents方法导致loginViewModel.username和loginViewModel.password属性并没有更新。当时我开始思考,是不是还需要其他条件还能触发它更新呢?由于我使用UITextField的rac_textSignal属性,于是我就查看它的源代码: 
Java代码 
  1. - (RACSignal *)rac_textSignal {  
  2.   @weakify(self);  
  3.   return [[[[[RACSignal  
  4.       defer:^{  
  5.           @strongify(self);  
  6.           return [RACSignal return:self];  
  7.       }]  
  8.       concat:[self rac_signalForControlEvents:UIControlEventEditingChanged |  UIControlEventEditingDidBegin]]  
  9.       map:^(UITextField *x) {  
  10.           return x.text;  
  11.       }]  
  12.       takeUntil:self.rac_willDeallocSignal]  
  13.       setNameWithFormat:@"%@ -rac_textSignal", self.rac_description];  
  14. }  

从源代码可以知道,只有触发UIControlEventEditingChanged或UIControlEventEditingDidBegin事件时才能创建RACSignal对象。 

业务逻辑测试 

由于这里需要验证用户名和密码,复用性高,我不将处理逻辑放在viewModel中,而是定义一个DataValidation来处理。这里的用户名是邮箱格式,而密码要求长度大于等于6即可,方法如下: 
Java代码 
  1. @interface DataValidation : NSObject  
  2.   
  3. + (BOOL)isValidEmail:(NSString *)data;  
  4. + (BOOL)isValidPassword:(NSString *)password;  
  5.   
  6. @end  

测试用例设计如下: 

 

图:数据验证 Test Case

然后使用kiwi编写测试如下: 
Java代码 
  1. SPEC_BEGIN(DataValidationSpec)  
  2. describe(@"DataValidation", ^{  
  3.     context(@"when email is samlau@163.com", ^{  
  4.         it(@"should return YES", ^{  
  5.             BOOL result = [DataValidation isValidEmail:@"samlau@163.com"];  
  6.             [[theValue(result) should] beYes];  
  7.         });  
  8.     });  
  9.     context(@"when email is samlau163.com", ^{  
  10.         it(@"should return YES", ^{  
  11.             BOOL result = [DataValidation isValidEmail:@"samlau163.com"];  
  12.             [[theValue(result) should] beNo];  
  13.         });  
  14.     });  
  15.     ......省略两个测试用例  
  16. });  

ViewModel层测试 

前面已经完成了数据绑定和数据校验逻辑,接下来思考使用哪个类处理用户名和密码是否有效才能点击和点击按钮后,如何调用网络层在来匹配用户名和密码,RAC提供一个RACCommand类。LoginViewModel定义一个属性loginCommand,并在实现文件中使用Lazy Initialization初始化: 
Java代码 
  1. - (RACCommand *)loginCommand  
  2. {  
  3.     if (!_loginCommand) {  
  4.         _loginCommand = [[RACCommand alloc] initWithEnabled:[self isValidUsernameAndPasswordSignal] signalBlock:^RACSignal *(id input) {  
  5.             return [LoginClient loginWithUsername:self.username password:self.password];  
  6.         }];  
  7.     }  
  8.     return _loginCommand;  
  9. }  

上面有一个重要方法isValidUsernameAndPasswordSignal来监听和验证用户名和密码: 
Java代码 
  1. - (RACSignal *)isValidUsernameAndPasswordSignal  
  2. {  
  3.     return [RACSignal combineLatest:@[RACObserve(self, username), RACObserve(self, password)] reduce:^(NSString *username, NSString *password) {  
  4.          return @([DataValidation isValidEmail:username] && [DataValidation isValidPassword:password]);  
  5.     }];  
  6. }  

由于上面的方法isValidUsernameAndPasswordSignal已经监听LoginViewModel的username和password,当username和password其中一个改变时,DataValidation类都会调用isValidEmail和isValidPassword来数据验证,并将结果包裹成RACSignal对象返回。 

测试用例设计如下: 

 

图:View Model Test Case


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

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

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