【问题标题】:iOS asserting NSMutableArray contains 2 objects, regardless of indexiOS 断言 NSMutableArray 包含 2 个对象,与索引无关
【发布时间】:2012-06-25 13:12:34
【问题描述】:

我的 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。这似乎适用于这种情况,但我在其他情况下排序可能会发生变化,因此可能会将 John 放在索引 1 中而不是 0 中

问题:我如何断言从调用[userService getAllUsers] 返回的NSMutableArray 包含这两个对象,而不管顺序如何?

【问题讨论】:

    标签: objective-c ios ios5 xcode4.3


    【解决方案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 属性的键值编码时才有效。

    【讨论】:

      【解决方案2】:
      1. NSMutableArray 在您将元素插入数组时始终包含这些元素

      2. 您可以遍历插入的元素并测试它们是否位于 NSArray 中,方法是:

      - (NSUInteger)indexOfObject:(id)anObject

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

      问候

      【讨论】:

        【解决方案3】:

        这样断言平等

           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 个 John Smiths
        • 也许你可以在向数组添加新元素之前检查一下;使名称唯一的一种方法是使用以名称为键的字典,而不是数组。也许矫枉过正......?
        猜你喜欢
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多