iOS断言NSMutableArray包含2个对象,无论索引如何

时间:2012-06-25 13:12:35

标签: objective-c ios ios5 xcode4.3

我的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个用户对象,一个名为John Smith,另一个名称为Dave Brown。这似乎适用于这种情况,但我有其他情况,其顺序可能会改变,所以约翰可能被放置在索引1而不是0

问题:如何判断从NSMutableArray调用返回的[userService getAllUsers]是否包含这两个对象,无论是否排序?

3 个答案:

答案 0 :(得分:1)

你能不能简单地使用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 :(得分:0)

  1. NSMutableArray在将数据插入数组时始终包含元素

  2. 您可以迭代插入的元素并使用以下方法测试它们是否在NSArray中:

  3. - (NSUInteger)indexOfObject:(id)anObject

    如果找不到该对象,则返回NSNotFound,可以与您选择的单元测试框架一起使用

    问候

答案 2 :(得分:0)

像这样断言平等

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