isKindOfClass意外返回NO

Mar*_*ell 18 cocoa objective-c

我的一个单元测试失败了,原因是我没有预料到.似乎是一个调用isKindOfClass返回NO,但是当我调试并逐步执行时,它似乎没有理由.

代码是:

if ([self.detailItem isKindOfClass:[MovieInfo class]]) {
    [self configureViewForMovie];
}
Run Code Online (Sandbox Code Playgroud)

我逐步完成了代码并做了:

po self.detailItem
Run Code Online (Sandbox Code Playgroud)

显示:

(id) $1 = 0x0ea8f390 <MovieInfo: 0xea8f390>
Run Code Online (Sandbox Code Playgroud)

那么,我错过了什么,为什么在这种情况下if语句会返回false?

编辑:

这是DetailItem的setter:

- (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        NSLog(@"%@", [newDetailItem class]);
        _detailItem = newDetailItem;

        // Update the view.
        [self configureView];
    }

    if (self.masterPopoverController != nil) {
        [self.masterPopoverController dismissPopoverAnimated:YES];
    } 
}
Run Code Online (Sandbox Code Playgroud)

它是Master Detail模板的模板代码.

单元测试在setUp中创建一个MovieInfo:

movie = [[MovieInfo alloc] initWithMovieName:@"Movie" movieID:1];
Run Code Online (Sandbox Code Playgroud)

并在测试中设置它

controller.detailItem = movie;
Run Code Online (Sandbox Code Playgroud)

另外,我添加了一个参数断言setDetailItem:

NSParameterAssert([newDetailItem isKindOfClass:[MovieInfo class]] || [newDetailItem isKindOfClass:[PersonInfo class]] || newDetailItem == nil);
Run Code Online (Sandbox Code Playgroud)

这个断言也失败了.

我在断言调用上面放了两个日志语句:

NSLog(@"%@", [newDetailItem class]);
NSLog(@"%@", newDetailItem);
Run Code Online (Sandbox Code Playgroud)

显示:

2012-08-28 08:31:37.574 Popcorn[8006:c07] MovieInfo
2012-08-28 08:31:38.253 Popcorn[8006:c07] <MovieInfo: 0x6daac50>
Run Code Online (Sandbox Code Playgroud)

一个更多编辑:

isKindOfClass在单元测试中设置它之前添加了检查,一个通过.

if ([movie isKindOfClass:[MovieInfo class]]) {
    NSLog(@"Yep"); //This passes and prints out
}
controller.detailItem = movie; //calls into the setter and fails.
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 16

这是因为被测试的类"DetailViewController"不在测试的目标中.我原以为这会以不同的方式表现出来(链接器错误或其他东西),但显然,它只会导致奇怪的行为.将DetailViewController添加到测试目标修复了问题.