NSDecimalNumber单元测试之争

NSDecimalNumber unit test struggle

我正在尝试为我的方法编写单元测试,在 NSDecimalNumber 上执行一些操作。为简单起见,我准备了这个简单的单元测试片段:

- (void) testTmp {
    NSDecimalNumber* val = [NSDecimalNumber decimalNumberWithString:@"0"];
    XCTAssertEqual([val stringValue], @"0");
}

不幸的是,它失败了,我无法让它工作。我究竟做错了什么?如何测试 NSDecimalNumber 的值是否等于其他值?

XCTAssertEqual() 比较对象引用。你应该使用 XCTAssertEqualObjects().

- (void) testTmp {
  NSDecimalNumber* val = [NSDecimalNumber decimalNumberWithString:@"0"];
  XCTAssertEqualObjects([val stringValue], @"0");
}

顺便说一句:你不应该比较数字的字符串表示,而是数字本身……:

- (void) testTmp {
  NSDecimalNumber* val = [NSDecimalNumber decimalNumberWithString:@"0"];
  XCTAssertEqualObjects(val, [NSDecimalNumber decimalNumberWithString:@"0"]);
}

... 或者(没查,NSNumberNSDecimalNumber是否可以相等,不过应该是这样)...

- (void) testTmp {
  NSDecimalNumber* val = [NSDecimalNumber decimalNumberWithString:@"0"];
  XCTAssertEqualObjects(val, @0);
}

但是,NSDecimalNumber 的实例是浮点值。比较它们的公平性是巫术。