我的一个单元测试失败了,原因是我没有预料到.似乎是一个调用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 …Run Code Online (Sandbox Code Playgroud) 我正在玩一个简单的OCUnit测试用于iPhone应用程序,并且只是想断言应用程序委托是我期望它的类的实例.我没想到这个测试非常有用,但结果却揭示了我对Objective C的误解.
我首先得到了代表的参考.然后我记录回来的类名.在我的例子中,输出正确地说"app delegate的类名是CalculatorAppDelegate".
但是,下一行的断言失败了,我不明白为什么.
- (void)testAppDelegate
{
id appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class]));
NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);
NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);
NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]);
STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf");
}
Run Code Online (Sandbox Code Playgroud)
什么情况可能导致NSStringFromClass()返回正确的类名,而isKindOfClass返回false?
2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0
2011-03-19 15:51:13.865 Calculator[40092:207] class == class …Run Code Online (Sandbox Code Playgroud)