【问题标题】:Unit-test testing for class equality类平等的单元测试测试
【发布时间】:2014-02-10 11:20:19
【问题描述】:

我正在向项目中添加一些单元测试,并希望有一个测试来检查从方法返回的数组是否不可变,因此我创建了以下单元测试:

- (void)testReturnedObjectIsOfTypeImmutableArray
{
    XCTAssertEqualObjects([NSArray class],
                          [[NSArray reverseArray:self.array] class],
                          @"NSArray should be returned");
}

但是这失败了,因为返回的对象是类“__NSArrayI”而不是“NSArray”。

我不知道如何调整上述内容以使“_NSArrayI”可以接受,而接收“_NSArrayM”或“NSMutableArray”应该是不可接受的。

【问题讨论】:

    标签: ios objective-c class unit-testing xctest


    【解决方案1】:

    正如答案中所建议的那样 How to get classname in objective c Like 'NSString',您可以使用classForCoder 代替class。示例:

    NSArray *a = @[@"foo"];
    NSMutableArray *b = [a mutableCopy];
    
    NSLog(@"a class: %@", [a class]); // -> __NSArrayI
    NSLog(@"b class: %@", [b class]); // -> __NSArrayM
    NSLog(@"a classForCoder: %@", [a classForCoder]); // -> NSArray
    NSLog(@"b classForCoder: %@", [b classForCoder]); // -> NSMutableArray
    

    所以这个测试应该给出预期的结果:

    - (void)testReturnedObjectIsOfTypeImmutableArray
    {
        XCTAssertEqualObjects([NSArray class],
                              [[NSArray reverseArray:self.array] classForCoder],
                              @"NSArray should be returned");
    }
    

    【讨论】:

    • 感谢 Martin,该解决方案非常适合我的需要
    【解决方案2】:

    测试类相等性是类集群的一个问题。

    使用isKindOfClass:[NSArray class]检查对象是否是NSArray的子类,然后检查它是否响应选择器@selector(addObject:)看它是否可变。

    BOOL isArray = [self.array isKindOfClass:[NSArray class]];
    BOOL isMutable = [self.array respondsToSelector:@selector(addObject:)];
    XCTAssertTrue(isArray && !isMutable, @"...");
    

    【讨论】:

    • (+1) 这是一个比我的更直接的解决方案。 (不相关但有趣的一点可能是这样的检查不适用于 NS(Mutable)String。这就是我想出不同方法的原因。)
    • 感谢 Sulthan,我将使用 Martin R 的解决方案,因为它可以与其他类一起使用,因此为项目中的这些类型的测试设定了标准
    【解决方案3】:

    _NSArrayI 是一个NSArray,所以如果你的reverseArray返回一个NSArray,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      相关资源
      最近更新 更多