我正在为项目添加一些单元测试,并希望测试一个方法返回的数组是不可变的,所以我创建了以下单元测试:
- (void)testReturnedObjectIsOfTypeImmutableArray
{
XCTAssertEqualObjects([NSArray class],
[[NSArray reverseArray:self.array] class],
@"NSArray should be returned");
}
但是这会失败,因为返回的对象是类“__NSArrayI”而不是“NSArray”。
我无法弄清楚如何调整上述内容以使“_ NSArrayI”可以接受,因为接收“ _NSArrayM”或“NSMutableArray”应该是不可接受的。
答案 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,它应该有效。