我的iOS应用程序中有以下测试用例:
-(void) testTwoDefaultUsersExist
{
NSString * expected;
NSString * actual;
expected = @"John Smith";
actual = [[[userService getAllUsers]objectAtIndex:0] fullName];
STAssertEqualObjects(expected, actual, @"Not equal");
expected = @"Dave Brown";
actual = [[[userService getAllUsers]objectAtIndex:1] fullName];
STAssertEqualObjects(expected, actual, @"Not equal");
}
上面只是检查我对 [userService getAllUsers]
的调用是否返回了 2 个 User 对象,一个名为 John Smith,另一个名为 Dave Brown。这似乎适用于这种情况,但我还有其他情况,该顺序可能会更改,因此 John 可能会被放置在索引 1 而不是 0 中
问题:我如何断言从调用[userService getAllUsers]
返回的NSMutableArray
包含这两个对象,无论顺序如何?
您不能简单地使用 NSArray 方法-containsObject:
?NSMutableArray 仍然是 NSArray,因此您可以执行以下操作:
NSArray * expected = [NSArray arrayWithObjects:@"John Smith", @"Dave Brown", nil];
NSArray * actual = [[userService getAllUsers] valueForKey:@"fullName"];
for(NSString * name in expected) {
STAssertTrue([actual containsObject:name], @"Missing name");
}
请注意,(ab)使用 -valueForKey:
将用户对象数组转换为 NSString 对象数组,使-containsObject:
调用更简单。仅当用户对象符合 fullName
属性的键值编码时,此操作才有效。
-
NSMutableArray 始终包含将元素插入数组的元素
-
您可以使用以下方法循环访问您插入的元素并测试它们是否在 NSArray 中:
- (NSUInteger)indexOfObject:(id)anObject
如果未找到该对象,它将返回 NSNotFound,该对象可与您选择的单元测试框架一起使用
问候
像这样断言平等
NSAssert1([userService getAllUsers].count == 2, @"SomeDescription", nil);
如果要在数组中搜索某些字符串的存在,请使用以下函数
- (BOOL) containsAllNames:(NSArray*)arrToSearch namesToSearch:(NSArray*)arr
{
BOOL containsAll = YES;
for (NSString *name in arr) {
BOOL containsCurrent = NO;
for (NSString *nameToSearch in arrToSearch) {
if ([name isEqualToString:nameToSearch]) {
containsCurrent = YES;
break;
}
}
if (!containsCurrent) {
containsAll = NO;
}
}
return containsAll;
}
称呼它为喜欢
NSArray *toSearch = [NSArray arrayWithObjects:@"John Smith", @"Dave Brown", nil];
[self containsAllNames:YourArray namesToSearch:toSearch];