我的一个单元测试失败了,因为一个我没有预料到的原因。对isKindOfClass
的调用似乎返回NO,但当我调试并单步执行时,似乎没有任何理由会返回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];
}
}
它是来自Master Detail模板的模板代码。
单元测试在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.
https://stackoverflow.com/questions/12159961
复制相似问题