的iOS断言NSMutableArray中包含2个对象,无论指数
问题描述:
的我在我的iOS应用程序下面的测试案例:的iOS断言NSMutableArray中包含2个对象,无论指数
-(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个用户对象,一个用的名称约翰史密斯,另一位戴夫布朗。这似乎为这种情况下正常工作,但我有其他的情况下,该顺序可能会改变,所以约翰可以放置在索引1,而不是0
问:我怎么可以断言,NSMutableArray
,正在从返回对[userService getAllUsers]
的调用包含这2个对象,无论排序如何?
答
你不能简单地使用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];
这只会断言有多少元素,无视元素本身,所以我可以有2个约翰史密斯 – Jimmy
也许你可以在添加一个新的元素之前检查数组;使名称唯一的一种方法是使用由名称键入的字典,而不是数组。也许矫枉过正......? –
@ James.Elsey检查更新的答案 –