【发布时间】:2013-03-24 15:30:05
【问题描述】:
使用 STAssertEquals for NSArray 检查 NSArray 项目计数的正确方法是什么。
以下预计会起作用:
...
STAssertEquals(1, [myArray count], @"One item should be in array");
此代码在运行测试时会产生“类型不匹配”运行时错误。
相反,我必须对 NSUInteger 进行显式转换:
STAssertEquals((NSUInteger)1, [myArray count], @"One item should be in array");
这可行 - 但由于显式转换,看起来有点难看。
我还想避免使用 STAssertTrue,因为 STAssertEquals 看起来更合适(我们比较两个值)并显示实际值和预期值。
在 Objective-C 中检查它的正确方法是什么?
更新 1
感谢建议使用 1u 作为 unsigned int 文字的答案
STAssertEquals(1u, [myArray count], @"One item should be in array");
但正如@Aaron 提到的那样,它仍然很丑 - 我想直接使用“1” - 现在考虑使用 myArray.count == 1 。原因是1u看起来不是很干净。 1对我来说就是1。你从来没有用数学写过 1u :-) 还有其他建议吗?
更新 2
正如@H2CO3 提到的,1u 甚至不能总是工作,并且正如某些线程中所建议的那样,我们可以对期望值使用更多的声明性定义,这将解决强制转换问题:
NSUInteger expectedItemsCount = 1;
STAssertEquals(expectedItemsCount, [myArray count], @"One item should be in array");
我更喜欢它而不是 1u 解决方案,因为它看起来更干净。但是这种方法的缺点是我们有额外的行并且代码不是很紧凑。所以看起来我们必须在两种方法之间进行选择:(NSUInteger)1 和 NSUInteger expectedItemsCount = 1;
【问题讨论】:
-
有趣,这意味着您打开了
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION标志,您是自己(或项目中的某个人)这样做的,还是最近的 Xcode 更新打开了它?我以为它默认是关闭的。 -
@Pascal OP 没有收到编译器警告 - 他收到 runtime 错误。
-
@Pascal 是的,系统中的另一个“Apple,你在做什么”...... :'(
-
实际上,@aaron-golden 进一步指出“STAssertEquals 宏显式检查参数的类型并在类型不相等时报错”。 那 是有道理的。
-
@Pascal - 是的,它发生在运行时,正如我在构建成功后看到的那样。我没有对项目进行任何具体更改并使用 XCode 版本 4.6 (4H127)
标签: objective-c ocunit