的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属性的键值编码兼容。

  1. 的NSMutableArray总是包含的元素,你将它们插入到数组

  2. 您可以在您插入和测试,如果他们在使用的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]; 
+0

这只会断言有多少元素,无视元素本身,所以我可以有2个约翰史密斯 – Jimmy

+0

也许你可以在添加一个新的元素之前检查数组;使名称唯一的一种方法是使用由名称键入的字典,而不是数组。也许矫枉过正......? –

+0

@ James.Elsey检查更新的答案 –