Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 用于检查NSArray计数的STAssertEquals-清洁方式_Objective C_Ocunit - Fatal编程技术网

Objective c 用于检查NSArray计数的STAssertEquals-清洁方式

Objective c 用于检查NSArray计数的STAssertEquals-清洁方式,objective-c,ocunit,Objective C,Ocunit,使用NSArray的STAssertEquals检查NSArray项目计数的正确方法是什么 预计将开展以下工作: ... STAssertEquals(1, [myArray count], @"One item should be in array"); 此代码在运行测试时产生“类型不匹配”运行时错误 相反,我必须对整数执行显式转换: STAssertEquals((NSUInteger)1, [myArray count], @"One item should be in array");

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

预计将开展以下工作:

...
STAssertEquals(1, [myArray count], @"One item should be in array");
此代码在运行测试时产生“类型不匹配”运行时错误

相反,我必须对整数执行显式转换:

STAssertEquals((NSUInteger)1, [myArray count], @"One item should be in array");
这是可行的,但由于演员阵容的明确,看起来有点难看

我还希望避免使用STAssertTrue,因为STASSERTQUALS看起来更合适(我们比较两个值),并显示实际值和预期值

在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)1
NSUInteger expecteditemscont=1

您可以使用
STAssertEquals(1U,myArray.count,@“数组中应包含一项”)
使1无符号。也许那还是很难看。打字少了一点。

C的打字系统

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

STAssertEquals(myArray.count, 1u, @"+1 item needed");
Edit:更好的是,上面的操作将在64位上失败(它将与
1ull
一起工作),因此如果您只使用

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

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

assertThat(myArray, hasCountOf(1));

如果你的项目很大,或者你希望这个代码有很长的使用寿命,考虑为这样的事情添加特定的断言。定义一个特例宏

  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==...)

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

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

STAssertEqualObjects(@(5), @(datas.count), @"unexpected array count");

有趣的是,这意味着您打开了标志
clangu警告\u可疑\u隐式\u转换
,您是自己(或项目中的某个人)还是最近的Xcode更新打开了该标志?我以为默认情况下它是关闭的。@Pascal OP没有收到编译器警告-他收到一个运行时错误。@Pascal是的,系统中的另一个“Apple,WTF you doing…”(事实上,@aaron golden进一步指出,“statsertequals宏显式检查参数的类型,如果类型不相等,则会进行投诉”。这是有道理的。@Pascal-是的,正如我在构建成功后看到的那样,这是在运行时发生的。我没有对项目进行任何具体更改,也没有使用XCode版本4.6(4H127)第二个版本对我来说似乎有点过头了,我只想把它铸造出来。@Pascal它比铸造好。(在C中,一切都比铸造好。)还有文字?我假设在这些情况下,它会提示编译器如何操作,它会使用正确的类型。@H2CO3感谢您对它的详细说明。线程中的信息肯定有助于理解我们所处的位置:-)所以现在我自己在更新2中选择了其中一种解决方案。@Pascal你说得对-编译器有时会执行隐式转换。这是一个愚蠢的断言宏,没有。谢谢你的回答。这是怎么一回事?汉克雷斯特?我不想在这里使用额外的库,而是使用标准工具。当你想要比较两个值时,hasCountOf看起来也很奇怪。我从未在Ruby或Java等其他语言中见过这种方法。但是感谢您指出这一点-了解所有可能的解决方案很好。Hamcrest出生于Java,现在是JUnit的标准部分。感谢您当时提到它-我甚至没有尝试在Java中使用它。那我看看!你好,马克伯恩斯坦。我认为创建特殊宏来检查数组计数会增加额外的复杂性。我们将使用我们已有的操作,而不是定义我们自己的数学:-)当然,如果您只是偶尔这样做,您不会想要自己的宏!但总的来说,这是一种非常有用的技术。有关详细信息,请参阅Meszaros关于xUnit测试模式的书。