Unit testing STAssertEquals将相等字符串报告为不同字符串

Unit testing STAssertEquals将相等字符串报告为不同字符串,unit-testing,sentestingkit,Unit Testing,Sentestingkit,我试图为一个库编写一个单元测试。库中的方法返回字符串,我希望确保它返回正确的字符串。但SenTestKit中的statsertequals宏将其视为不同的值,尽管它是相同的 您可以看到描述部分清楚地显示了两个字符串值是相同的,但这个宏表示它们的值是不同的。当我从方法返回静态字符串时(就像返回@“op_user”),它通过了测试用例。有人知道是什么原因导致相同字符串值的测试失败吗 我想你应该使用而不是。前者用于Objective-C实例,后者用于基本类型 从: STAssertEqualObjec

我试图为一个库编写一个单元测试。库中的方法返回字符串,我希望确保它返回正确的字符串。但SenTestKit中的statsertequals宏将其视为不同的值,尽管它是相同的

您可以看到描述部分清楚地显示了两个字符串值是相同的,但这个宏表示它们的值是不同的。当我从方法返回静态字符串时(就像返回
@“op_user”
),它通过了测试用例。有人知道是什么原因导致相同字符串值的测试失败吗

我想你应该使用而不是。前者用于Objective-C实例,后者用于基本类型

从:

STAssertEqualObjects

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

斯塔塞特奎尔斯

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

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

要比较实际的字符串内容,您需要使用这个方法,这正是StasserteQualobObjects()所做的。

我认为您应该使用而不是。前者用于Objective-C实例,后者用于基本类型

从:

STAssertEqualObjects

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

斯塔塞特奎尔斯

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

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

要比较实际的字符串内容,您应该使用这个方法,这正是StasserteQualobObjects()所做的。

这不是一个完全正确的答案(因为Marc已经正确地回答了),但作为一般规则,永远不要使用
STAssertEquals

它使用了一种可疑的方法,首先检查参数的类型是否相等,使用
@encode
确定类型,然后基本上执行memcmp。因此,变量定义如下

int i = 1; 
unsigned int ui = 1;
assert(i == ui);
STAssertEquals(i, ui, @"");
将让
statsertequals
失败-即使值相等

signed char sc = 1;
char c = 1;
STAssertEquals(sc, c, @"");
猜怎么着?
(提示:类型不相等!)

。。。将成功,因为
@encode
无法区分
无符号字符
有符号字符
,但它们是不同的类型

其他问题是结构中的填充,其中
memcmp
可能返回非零,但结构值实际上比较相等

因此,最好不要使用
statsertequals
,以及采用同样荒谬方法的继任者
xctasertequal

这不是一个很好的答案(因为Marc已经正确地回答了),但作为一般规则,永远不要使用
statsertequals

它使用了一种可疑的方法,首先检查参数的类型是否相等,使用
@encode
确定类型,然后基本上执行memcmp。因此,变量定义如下

int i = 1; 
unsigned int ui = 1;
assert(i == ui);
STAssertEquals(i, ui, @"");
将让
statsertequals
失败-即使值相等

signed char sc = 1;
char c = 1;
STAssertEquals(sc, c, @"");
猜怎么着?
(提示:类型不相等!)

。。。将成功,因为
@encode
无法区分
无符号字符
有符号字符
,但它们是不同的类型

其他问题是结构中的填充,其中
memcmp
可能返回非零,但结构值实际上比较相等


所以最好不要使用
statsertequals
,也不要使用它的继承者
xctasertequal
,因为它采用了同样荒谬的方法。

谢谢,我的想法正好相反,statsertequalobjects比较的是对象本身而不是内容。感谢感谢,我的想法和STAssertEqualObjects比较对象本身而不是内容的方式相反。谢谢你。我还查看了宏定义,想知道@encode与它有什么关系。
@encode
编译器指令为给定类型返回一个唯一的字符串表示形式,它可以是标量或结构(除了
有符号字符
,它返回与
字符
相同的编码)。更多关于这里:。在我看来,不适合实现通用比较算法。C++模板可能是所有标量类型(不是结构,而不是C字符串)的选项。好点。我还查看了宏定义,想知道@encode与它有什么关系。
@encode
编译器指令为给定类型返回一个唯一的字符串表示形式,它可以是标量或结构(除了
有符号字符
,它返回与
字符
相同的编码)。更多关于这里:。在我看来,不适合实现通用比较算法。C++模板可能是所有标量类型(不是结构,而不是C字符串)的选项。