我的一个单元测试失败了,原因是我没有预料到.似乎是一个调用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 Test类:PatientTestViewControllerTests.以下是界面:
@interface PatientTestViewControllerTests : SenTestCase
@property (nonatomic, strong) PatientTestViewController *testController;
@end
Run Code Online (Sandbox Code Playgroud)
和setUp:
- (void) setUp
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Testing" bundle:nil];
self.testController = [storyboard instantiateInitialViewController];
}
Run Code Online (Sandbox Code Playgroud)
"测试"故事板是我应用程序中唯一的故事板,并被设置为应用程序的主要故事板.PatientTestViewController被设置为故事板的唯一视图控制器.
我的测试课中有一个测试:
- (void) testInitialTestingStoryboardViewIsPatientTest
{
STAssertTrue([self.testController isMemberOfClass:[PatientTestViewController class]], @"Instead of the %@, we have %@",[PatientTestViewController class], [self.testController class]);
}
Run Code Online (Sandbox Code Playgroud)
此测试失败,并显示以下日志消息:
错误: - [PatientTestViewControllerTests testInitialTestingStoryboardViewIsPatientTest]:"[self.testController isMemberOfClass:[PatientTestViewController class]]"应为true.取而代之的是的PatientTestViewController,我们有PatientTestViewController
怎么会这样?以来
[self.testController isMemberOfClass:[PatientTestViewController class]]
显然是错误的,测试日志怎么能说两者都有
[self.testController class] 和 [PatientTestViewController class]
看起来一样?
附加信息:
[self.testController isKindOfClass:[PatientTestViewController class]]测试也失败使用[self.testController class] == [PatientTestViewController …
最新版本的Objective-C和XCode(4.4).
我有一个代码片段,我无法理解为什么我能够使用某些行,让我解释一下:
// For understanding purpose : (NSMutableArray*)_programStack
id l_topItemOnStack = [_programStack lastObject];
if([l_topItemOnStack isKindOfClass:[NSNumber class]])
{
return [l_topItemOnStack doubleValue];
}
Run Code Online (Sandbox Code Playgroud)
我的问题:因为我l_topItemOnStack的类型id而且我没有把它变成一个NSNumber,我怎么能用到[l_topItemOnStack doubleValue].
我猜我必须首先将其转换为NSNumber以访问NSNumber方法...
我在这里错过了什么?