【发布时间】:2012-08-28 13:08:33
【问题描述】:
我的一个单元测试失败了,原因是我没有预料到的。似乎对 isKindOfClass 的调用返回 NO,但是当我调试并逐步执行时,似乎没有理由这样做。
代码是:
if ([self.detailItem isKindOfClass:[MovieInfo class]]) {
[self configureViewForMovie];
}
我单步执行了代码并做到了:
po self.detailItem
显示:
(id) $1 = 0x0ea8f390 <MovieInfo: 0xea8f390>
那么,我错过了什么,为什么在这种情况下 if 语句会返回 false?
编辑:
这里是 DetailItem 的设置器:
- (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];
}
}
它是来自主从模板的模板代码。
单元测试在setUp中创建一个MovieInfo:
movie = [[MovieInfo alloc] initWithMovieName:@"Movie" movieID:1];
并在测试中设置它
controller.detailItem = movie;
另外,我在setDetailItem中添加了参数断言:
NSParameterAssert([newDetailItem isKindOfClass:[MovieInfo class]] || [newDetailItem isKindOfClass:[PersonInfo class]] || newDetailItem == nil);
这个断言也失败了。
我在断言调用上方放置了两条日志语句:
NSLog(@"%@", [newDetailItem class]);
NSLog(@"%@", newDetailItem);
哪个显示:
2012-08-28 08:31:37.574 Popcorn[8006:c07] MovieInfo
2012-08-28 08:31:38.253 Popcorn[8006:c07] <MovieInfo: 0x6daac50>
更多编辑:
我在单元测试中设置它之前添加了isKindOfClass 检查,该检查通过了。
if ([movie isKindOfClass:[MovieInfo class]]) {
NSLog(@"Yep"); //This passes and prints out
}
controller.detailItem = movie; //calls into the setter and fails.
【问题讨论】:
-
您是否以这样的方式覆盖了
- detailItem,以至于当您再次调用它时它可能会返回不同的结果? -
你能显示你分配
self.detailItem的代码吗?重要的是它是一个实例,而不是类对象。 -
“MovieInfo”的超类是什么?
-
MovieInfo 是一个 NSObject
-
你怎么知道
isKindOfClass正在返回NO?似乎您没有在任何地方检查返回值...您只是对class进行了两次和三次检查,并且您多次记录它们,但您没有在任何地方检查isKindOfClass的返回值...您能记录返回值,也许?
标签: objective-c cocoa