如何使用 xcttest 测试对象相等性?

Posted

技术标签:

【中文标题】如何使用 xcttest 测试对象相等性?【英文标题】:how to test object equality using xcttest? 【发布时间】:2014-01-21 00:00:04 【问题描述】:

我的方法返回一个 NSNumber*,我想对这个方法进行单元测试。由于我的实际返回值为 NSNumber*,因此我创建了一个新的预期值 NSNumber*,但它失败了。代码如下:

NSNumber *cRating = [movie getRating:ratingDictionary ratingType:criticRating];
XCTAssertEqualObjects(cRating, [[NSNumber alloc]initWithInt:70], @"");

错误是:

[SFModelTest testGetCriticRatingMethod] failed: ((cRating) equal to ([[NSNumber alloc]initWithInt:70])) failed: ("70") is not equal to ("70")

既然它说“70”不等于“70”,我猜它与alloc init有关。一些不相​​等的指针东西。有人可以帮忙吗?谢谢。

编辑评论:添加 getRating 方法

- (NSNumber *)getRating:(NSDictionary *)movieDic ratingType:(enum RatingsEnum) rating

    NSNumber *result = 0;
    NSNumber *ratingNum = 0;

    switch (rating) 
        case userRating:
        
            ratingNum = [movieDic objectForKey:@"audience_score"];
            break;
        
        case criticRating:
        
            ratingNum = [movieDic objectForKey:@"critics_score"];
            break;
        
        default:
            break;
    

    if(ratingNum && ratingNum > 0)
    
        result = ratingNum;
    

    return result;

该方法返回 NSNumber。我的测试是:

NSNumber *cRating = [movie getRating:ratingDictionary ratingType:criticRating];
XCTAssertEqualObjects(cRating, [[NSNumber alloc]initWithInt:70], @"");

当我执行 NSLOG 类时,它返回 __NSCFConstantString。我现在很困惑。

【问题讨论】:

getRating:ratingType: 方法中,您如何创建NSNumber NSNumber *result = 0;然后我在方法结束时返回结果。 尝试记录cRating的类。即NSLog(@"%@", [cRating class]) 并确保它不是NSString 或其他东西 如果只用[[NSNumber alloc]initWithInt:70] 替换[movie getRating:ratingDictionary ratingType:criticRating]; 会发生什么? 类是 __NSCFConstantString。 【参考方案1】:

我认为你做错了什么,因为 XCTAssertEqualObjects(@(1), @(1), @"Not equal.");XCTAssertEqualObjects([NSNumber numberWithInt:1], [NSNumber numberWithInt:1], @"Not equal."); 如果你不熟悉文字,会通过。

您应该检查getRating:ratingType: 方法以查看它返回的对象类型。

尝试在 XCTAssertEqualObjects 之前添加断点并检查 cRating 实例。

【讨论】:

我添加了更多代码。问题似乎是将字典对象转换为 NSNumber。但我无法确定。 我能想到发生这种情况的唯一方法是确保值正确的方法是,movieDic 具有其值的数据是 JSON 格式,并且您没有反序列化它正确。

以上是关于如何使用 xcttest 测试对象相等性?的主要内容,如果未能解决你的问题,请参考以下文章

如何散列和检查具有循环引用的对象的相等性

如何在 JSF 中测试枚举相等性?

javafx如何测试图像相等性?

如何确定两个 JavaScript 对象的相等性?

对象Equals相等性比较的通用实现

如何在 CoreBluetooth 中测试两个 CBPeripheral 的相等性?