类相等的单元测试测试

时间:2014-02-10 11:20:20

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

我正在为项目添加一些单元测试,并希望测试一个方法返回的数组是不可变的,所以我创建了以下单元测试:

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

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

我无法弄清楚如何调整上述内容以使“_ NSArrayI”可以接受,因为接收“ _NSArrayM”或“NSMutableArray”应该是不可接受的。

3 个答案:

答案 0 :(得分:3)

如答案所示 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");
}

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

_NSArrayI NSArray,因此,如果您的reverseArray正在返回NSArray,它应该有效。