objective-c - 用于检查 NSArray 计数的 STAssertEquals - 干净的方式

标签 objective-c ocunit

使用 NSArray 的 STAsertEquals 检查 NSArray 项目计数的正确方法是什么。

以下预计会起作用:

...
STAssertEquals(1, [myArray count], @"One item should be in array");

此代码在运行测试时会产生“类型不匹配”运行时错误。

相反,我必须对 NSUInteger 进行显式转换:

STAssertEquals((NSUInteger)1, [myArray count], @"One item should be in array");

这有效 - 但由于显式转换看起来有点丑。

我还想避免使用 STAsertTrue,因为 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)1NSUInteger expectedItemsCount = 1;

最佳答案

C 的类型系统...

1int,所以它是有符号的。 NSArray.countNSUInteger 所以它是无符号的。使整数文字无符号:

STAssertEquals(myArray.count, 1u, @"+1 item needed");

编辑:更好的是,上面的代码在 64 位上会失败(它可以在 1ull 那里工作),所以如果你只使用像

const NSUInteger expectedLength = 1;
STAssertEquals(myArray.count, expectedLength, @"+1 item needed");

(The thread from where I stole this...)

关于objective-c - 用于检查 NSArray 计数的 STAssertEquals - 干净的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15600353/

相关文章:

objective-c - iOS:UIPasteboard setImage:在 iOS6 和/或 Xcode 4.5 上失败

objective-c - iOS11 Swift 4 - 如何检查 Swift 类是否符合 Objective-C 中定义的协议(protocol)?

ios - 如何以编程方式终止 iOS 中的进程

objective-c - 按下按钮时获取 UITableView 单元格的行

objective-c - 使用从测试方法调用的方法的类的 OCMock

ios - Facebook 身份验证后 View 延迟显示

objective-c - OCUnit 测试在未测试的类中给出错误

iphone - Xcode 4 使用命令行进行单元测试

ios - 代码 : One test target for multiple app targets

ios - 基于iOS版本的条件单元测试