4

使用 STAssertEquals 为 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 作为无符号整数文字的答案

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;

4

5 回答 5

4

C的类型系统...

1int,所以它已签名。NSArray.count所以NSUInteger它是未签名的。使整数文字无符号:

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

编辑:更好的是,以上将在 64 位上失败(它可以在1ull那里工作),所以如果你只使用类似的东西怎么办

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

(我偷这个的线程......)

于 2013-03-24T15:40:59.033 回答
1

您可以使用STAssertEquals(1U, myArray.count, @"One item should be in array");使 1 无符号。也许这仍然很丑陋。打字少了一点。

于 2013-03-24T15:40:44.580 回答
1

1U 是正确的。但是,如果您想避免这种丑陋(并进入一个更好的断言世界),请使用 OCHamcrest:

assertThat(myArray, hasCountOf(1));
于 2013-03-25T16:19:30.723 回答
0

我这样做的方法是将它们作为对象进行比较,这将在 32 位和 64 位上工作,防止需要任何强制转换或不必要的变量声明,并维护一个包含失败值的漂亮失败消息:

STAssertEqualObjects(@(5), @(datas.count), @"unexpected array count");
于 2013-11-22T16:41:56.610 回答
0

如果您的项目很大,或者您希望此代码具有较长的生命周期,请考虑为此类添加特定的断言。定义一个特例宏

  STArrayCount(myArray,1)

可以扩展到类似的东西

  STAssertTrue(myArray.count==1u,@"Expected %u but array count is %u",myArray.count,1);

编写自定义断言使您的单元测试在几年后重新访问时更加清晰,并且还为额外的测试提供了一个钩子。假设今天 myArray 是一个 NSArray,但后来它变成了 BigFancyObject 的一个实例,可以做一些其他的事情。BigFancyObjects 使您的大部分代码更加简洁并隐藏了实现细节,这一切都很棒。但是您想确保 BigFancyObject 是有效的,因为某些东西不断使它们无效。因此,您可以将 STArrayCount 重新定义为

  STAssertTrue(myArray.isValid && myArray.count==...)

现在您的单元测试也检查对象的有效性。

于 2013-03-25T18:58:37.737 回答