Ell*_*nce 0 unit-testing introspection objective-c ochamcrest
我有一个单元测试:
- (void)testFetchTrackByTrackIdIsATrack
{
[self addTrackWithSongId:@"123"];
Track *fetchedTrack = [self.library trackByTrackId:@"123"];
assertThat(fetchedTrack, instanceOf([Track class]));
}
Run Code Online (Sandbox Code Playgroud)
哪个失败了:
file:///Users/elliot/Development/Hark/HarkTests/TestLibrary.m: test failure:
-[TestLibrary testFetchTrackByTrackIdIsATrack] failed: Expected an instance
of Track, but was Track instance <Track: 0x6180001077d0>
Run Code Online (Sandbox Code Playgroud)
我有几个其他测试使用相同的实例检查不同的类工作 - 但我无法锻炼为什么这不起作用.深入研究:
- (void)testFetchTrackByTrackIdIsATrack
{
[self addTrackWithSongId:@"123"];
Track *fetchedTrack = [self.library trackByTrackId:@"123"];
Class c1 = [fetchedTrack class];
Class c2 = [Track class];
}
Run Code Online (Sandbox Code Playgroud)
调试器报告:
c1 Class Track 0x0000000100012fe0
c2 Class 0x1000b3eb8 0x00000001000b3eb8
Run Code Online (Sandbox Code Playgroud)
注意它怎么看不到那[Track class]是一类Track?当我将这个相同的逻辑应用于其他传递的单元测试时,它们都会报告正确的类名.
感觉它在运行时没有类元数据,但为什么呢?
还有一些案例:
assertTrue(c1 == c2); // FAIL
assertThat([fetchedTrack classDescription],
equalTo([Track classDescription])); // PASS
assertTrue([fetchedTrack isKindOfClass:[Track class]]); // FAIL
Run Code Online (Sandbox Code Playgroud)
有许多理由说明为什么课程的地址可能不会随着时间的推移而保持不变,而且大多数原因归结为使用Key-Value Observing.
当观察实例时,运行时(实际上是Foundation框架)组成了一个新类,它是包含观察机制的实例原始类的子类.
这导致无法使用指针比较.这也意味着类的某些类型的内省将无法产生预期的结果.
简而言之; 对所有这些测试使用isKindOfClass:和isMemberOfClass:方法,并且从不使用指针相等性测试(通常用于此或用于比较实例).