代码改变世界

单元测试之NSNull 检测

2016-04-28 18:03  灯泡虫  阅读(500)  评论(0编辑  收藏  举报

本文主要讲 单元测试之NSNull 检测,在现实开发中,我们最烦的往往就是服务端返回的数据中隐藏着NSNull的数据,一般我们的做法是通过[data isKindOfClass:[NSNull class]]  对数据先做一层判断然后为空的情况下付给 空字符串或者一些其他的初始变量。但是,业务数据层的代码本来就比较繁杂,还要我加上这个多余的判断来添堵?门都没有!那么我们的单元测试就派上用处了。

我们用一个带空数据的接口来走一遍流程。

数据大概是这样子的,其中data 下的 isLike字段的值是NSNull 状态

 

 

1.在test文件中新建一个test

- (void)testGetNoticeListWithExerciseType{

  //此处换成你自己的接口
  [NetManager getNoticeListWithExerciseType:@"" keyword:@"" pageSize:@"" pageNum:@"" whenSuccess:^(NSDictionary *responseDic) {
        //数据非空
       XCTAssertNotNil(responseDic, @"返回出错");

       //返回码为0的情况下是正确的 (这个你们的有可能不是)
        XCTAssertTrue([[responseDic objectForKey:@"code"] isEqualToNumber:@(0)],@"code 必须是@(0)");
       //判断数据的所有层是否都为非空(可以返回一个免检字段的key数组,允许数组中的字段为空 )
     [self judgeNullData:[responseDic objectForKey:@"data"] andKey:nil exemptionKeys:^NSArray *{
            return @[@"isLike",@"like_count"];
}];
       //判断数据的所有层是否都为非空(必须所有字段都未非空才能通过测试)
        //[self judgeNullData:[responseDic objectForKey:@"data"] andKey:nil exemptionKeys:nil];
        NOTIFY //继续执行
    } andFailed:^(NSString *errorDesc) {
        NOTIFY //继续执行
    }];
   //等待 
    WAIT
}

 

 

2.核心代码(粘贴到该test文件下)

/**
 *  覆盖检测数据中是否含有NSNull 数据
 *  日常中一般情况的下的闪退大多都是数据的空导致的,事先检测出是否包含空的数据能大大提升程序的稳定性
 *
 *  @param data 字典或者数组数据    (一般由json转化而来)
 *  @param key  data 的 key       (多层数据情况下直接置nil即可)
 *  @param keys 免检字段            (在这里 返回你运行为空的字段名称的key数组)
 */
- (void)judgeNullData:(nullable id)data andKey:(nullable NSString *)key exemptionKeys:( NSArray * (^)(void))keys{
    //字典
    if ([data isKindOfClass:[NSDictionary class]]) {
        for (id obj in ((NSDictionary *)data).allKeys) {
            //递归遍历字典
            [self judgeNullData:[((NSDictionary *)data) objectForKey:obj] andKey:obj exemptionKeys:keys];
        }
    }
    //数组
    else if ([data isKindOfClass:[NSArray class]]) {
        for (id obj in data) {
            //递归遍历数组
            [self judgeNullData:obj andKey:nil exemptionKeys:keys];
        }
    }
    //除字典和数组外(进行非空判断)
    else{
        //添加免检字段(允许array数组中的字段为NSNull)
        if (keys) {
            NSArray *array =  keys();
            if ([array containsObject:key]) {
                return;
            }
        }
    
        //断言检测字段非空
        //检测nil
        XCTAssertNotNil(data);  //这个断言不能判断 NSNull 只能判断nil
        //检测NSNull
        XCTAssertFalse([data isKindOfClass:[NSNull class]],@"字段为空"); //, @"字段为空"
     
        //打印输出空的字段
        if ([data isKindOfClass:[NSNull class]]) {
            if (!(key == nil)) {
                NSLog(@"key:%@ 对应的值为NSNull",key);
            }
        }
        
        if (data == nil) {
             NSLog(@"数组为空");
}
return; } }

 

 

3.如下图,点击左上角的开始测试

 

 

4.最后测试会报错,如下

 

5.最后把你查到的空字段发给后台的人,让他们给这些字段加个初始值就ok了。还有一点值得提醒的是每次要上新版本之前最好都全面测试一遍接口,能有效的降低奔溃率!赶紧试试吧!