iOS 断言 NSMutableArray 包含 2 个对象,与索引无关



我的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 属性的键值编码时,此操作才有效。

  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];

最新更新