我正在尝试为库编写单元测试。库中的一个方法返回字符串,我想确保它返回正确的字符串。但是STAssertEquals
SenTestKit 中的某些宏将其视为不同的值,即使它是相同的。
您可以看到描述部分清楚地表明两个字符串值相同,但该宏抱怨它们的值不同。当我从方法返回静态字符串时(就像 return 一样@"op_user"
)它通过了测试用例。任何人都知道是什么原因导致此测试失败且具有相同的字符串值?
我正在尝试为库编写单元测试。库中的一个方法返回字符串,我想确保它返回正确的字符串。但是STAssertEquals
SenTestKit 中的某些宏将其视为不同的值,即使它是相同的。
您可以看到描述部分清楚地表明两个字符串值相同,但该宏抱怨它们的值不同。当我从方法返回静态字符串时(就像 return 一样@"op_user"
)它通过了测试用例。任何人都知道是什么原因导致此测试失败且具有相同的字符串值?
我认为您想使用STAssertEqualObjects()而不是STAssertEquals()。前者用于 Objective-C 实例,后者用于原始类型。
从文档:
STAssertEqualObjects
当两个对象不同时,测试用例失败。
STAssertEquals
当两个值不同时,测试用例失败。
如果您将 Objective-C 对象与 STAssertEquals() 进行比较,您只是在比较它们的指针值。它们可以指向两个包含相同字符串的不同字符串对象。即使它们的指针值不同,您也会希望它们比较相等。
要比较实际的字符串内容,您将使用isEqual:方法,这正是 STAssertEqualObjects() 所做的。
不完全是一个答案(因为 Marc 已经正确回答了),但作为一般规则,永远不要使用STAssertEquals
!
它使用了一种有问题的方法,首先检查参数的类型是否相等,使用@encode
来确定类型,然后基本上执行一个 memcmp。因此,变量定义如下
int i = 1;
unsigned int ui = 1;
assert(i == ui);
STAssertEquals(i, ui, @"");
会让STAssertEquals
失败 - 即使值相等。
尽管
signed char sc = 1;
char c = 1;
STAssertEquals(sc, c, @"");
你猜怎么着?
(提示:类型不相等!)
... 会成功,因为@encode
无法区分 anunsigned char
和 an signed char
,但它们是不同的类型!
其他问题是结构中的填充,其中memcmp
可能返回非零但结构值实际上比较相等。
所以最好不要使用STAssertEquals
,它的继任者XCTAssertEqual
也采用了同样荒谬的方法。