我有一个单元测试:
- (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
答案 0 :(得分:5)
为什么课程地址随着时间的推移可能不会保持不变,并且大部分地址都归结为使用键值观察,这有很多原因。
当观察一个实例时,运行时(实际上是Foundation框架)组成了一个新类,它是包含观察机制的实例原始类的子类。
这导致无法使用指针比较。这也意味着类的内省的某些类型将无法产生预期的结果。
总之;对所有此类测试使用isKindOfClass:
和isMemberOfClass:
方法,从不使用指针相等性测试(对于此或通常用于比较实例)。