gpt4 book ai didi

objective-c - XCTAssertEqual 错误 : ("3") is not equal to ("3")

转载 作者:IT老高 更新时间:2023-10-28 11:48:13 25 4
gpt4 key购买 nike

NSMutableArray *arr = [NSMutableArray array];
[arr addObject:@"1"];
[arr addObject:@"2"];
[arr addObject:@"3"];

// This statement is fine.
XCTAssertTrue(arr.count == 3, @"Wrong array size.");

// This assertion fails with an error: ((arr.count) equal to (3)) failed: ("3") is not equal to ("3")
XCTAssertEqual(arr.count, 3, @"Wrong array size.");

我对 XCTAssertEqual 有哪些不了解的地方?为什么最后一个断言失败?

最佳答案

我在 Xcode 5 的测试中也遇到了不少麻烦。它似乎仍然存在一些奇怪的行为,但我已经找到了您的特定 XCTAssertEqual 不起作用的明确原因。

如果我们看一下测试代码,我们会发现它实际上执行了以下操作(直接取自 XCTestsAssertionsImpl.h - 在那里可能更容易查看):

#define _XCTPrimitiveAssertEqual(a1, a2, format...) \
({ \
@try { \
__typeof__(a1) a1value = (a1); \
__typeof__(a2) a2value = (a2); \
NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \
NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \
float aNaN = NAN; \
NSValue *aNaNencoded = [NSValue value:&aNaN withObjCType:@encode(__typeof__(aNaN))]; \
if ([a1encoded isEqualToValue:aNaNencoded] || [a2encoded isEqualToValue:aNaNencoded] || ![a1encoded isEqualToValue:a2encoded]) { \
_XCTRegisterFailure(_XCTFailureDescription(_XCTAssertion_Equal, 0, @#a1, @#a2, _XCTDescriptionForValue(a1encoded), _XCTDescriptionForValue(a2encoded)),format); \
} \
} \
@catch (id exception) { \
_XCTRegisterFailure(_XCTFailureDescription(_XCTAssertion_Equal, 1, @#a1, @#a2, [exception reason]),format); \
}\
})

问题出在这里:

测试实际所做的是将值编码为 NSValue,然后进行比较。 “好吧,”你说,“但那有什么问题?”在我为它制作自己的测试用例之前,我也不认为有一个。问题是 NSValue 的 -isEqualToValue 还必须比较 NSValue 的 编码类型 以及它的实际值。 两者必须相等才能返回YES

在您的情况下,arr.countNSUInteger,它是 unsigned int 的 typedef。编译时常量 3 大概会在运行时退化为 signed int。因此,当将两者放入 NSValue 对象时,它们的编码类型不相等,因此根据 -[NSValue isEqualToValue] 两者不能相等。

您可以通过一个自定义示例来证明这一点。以下代码明确执行 XCTAssertEqual 所做的事情:

// Note explicit types
unsigned int a1 = 3;
signed int a2 = 3;

__typeof__(a1) a1value = (a1);
__typeof__(a2) a2value = (a2);

NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))];
NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))];

if (![a1encoded isEqualToValue:a2encoded]) {
NSLog(@"3 != 3 :(");
}

"3 != 3 :(" 每次都会出现在日志中。

我赶紧在这里补充一下,这实际上是预期的行为。 NSValue 应该 在进行比较时检查其类型编码。不幸的是,这不是我们在测试两个(“相等”)整数时所期望的。

XCTAssertTrue 顺便提一下,它的逻辑要简单得多,并且通常按预期运行(再次,请参阅实际来源,了解它如何确定断言是否失败)。

关于objective-c - XCTAssertEqual 错误 : ("3") is not equal to ("3"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19178109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com