1

我正在尝试为库编写单元测试。库中的一个方法返回字符串,我想确保它返回正确的字符串。但是STAssertEqualsSenTestKit 中的某些宏将其视为不同的值,即使它是相同的。在此处输入图像描述

您可以看到描述部分清楚地表明两个字符串值相同,但该宏抱怨它们的值不同。当我从方法返回静态字符串时(就像 return 一样@"op_user")它通过了测试用例。任何人都知道是什么原因导致此测试失败且具有相同的字符串值?

4

2 回答 2

5

我认为您想使用STAssertEqualObjects()而不是STAssertEquals()。前者用于 Objective-C 实例,后者用于原始类型。

文档

STAssertEqualObjects

当两个对象不同时,测试用例失败。

STAssertEquals

当两个值不同时,测试用例失败。

如果您将 Objective-C 对象与 STAssertEquals() 进行比较,您只是在比较它们的指针值。它们可以指向两个包含相同字符串的不同字符串对象。即使它们的指针值不同,您也会希望它们比较相等。

要比较实际的字符串内容,您将使用isEqual:方法,这正是 STAssertEqualObjects() 所做的。

于 2013-09-17T04:26:51.087 回答
2

不完全是一个答案(因为 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也采用了同样荒谬的方法。

于 2013-09-17T17:16:04.787 回答