比较[类]不起作用?

时间:2014-03-12 21:46:17

标签: objective-c unit-testing introspection ochamcrest

我有一个单元测试:

- (void)testFetchTrackByTrackIdIsATrack
{
    [self addTrackWithSongId:@"123"];
    Track *fetchedTrack = [self.library trackByTrackId:@"123"];
    assertThat(fetchedTrack, instanceOf([Track class]));
}

哪个失败了:

file:///Users/elliot/Development/Hark/HarkTests/TestLibrary.m: test failure:
-[TestLibrary testFetchTrackByTrackIdIsATrack] failed: Expected an instance
of Track, but was Track instance <Track: 0x6180001077d0>

我还有其他几个测试使用相同的实例检查不同的类,但我无法解决为什么这不起作用。深入研究:

- (void)testFetchTrackByTrackIdIsATrack
{
    [self addTrackWithSongId:@"123"];
    Track *fetchedTrack = [self.library trackByTrackId:@"123"];
    Class c1 = [fetchedTrack class];
    Class c2 = [Track class];
}

调试器报告:

c1  Class   Track           0x0000000100012fe0
c2  Class   0x1000b3eb8     0x00000001000b3eb8

请注意,[Track class]Track类的?当我将这个相同的逻辑应用于其他传递的单元测试时,它们都会报告正确的类名。

感觉它在运行时没有类元数据,但为什么?

更多案例:

assertTrue(c1 == c2);                                   // FAIL
assertThat([fetchedTrack classDescription],
  equalTo([Track classDescription]));                   // PASS
assertTrue([fetchedTrack isKindOfClass:[Track class]]); // FAIL

1 个答案:

答案 0 :(得分:5)

为什么课程地址随着时间的推移可能不会保持不变,并且大部分地址都归结为使用键值观察,这有很多原因。

当观察一个实例时,运行时(实际上是Foundation框架)组成了一个新类,它是包含观察机制的实例原始类的子类。

这导致无法使用指针比较。这也意味着类的内省的某些类型将无法产生预期的结果。

总之;对所有此类测试使用isKindOfClass:isMemberOfClass:方法,从不使用指针相等性测试(对于此或通常用于比较实例)。