相关疑难解决方法(0)

isKindOfClass意外返回NO

我的一个单元测试失败了,原因是我没有预料到.似乎是一个调用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)

cocoa objective-c

18
推荐指数
1
解决办法
4205
查看次数

当从UIStoryboard实例化ViewController时,isMemberOfClass返回no

我有一个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 …

unit-testing objective-c ocunit ios

4
推荐指数
1
解决办法
1518
查看次数

Objective-C理解isKindOfClass

最新版本的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方法...

我在这里错过了什么?

casting objective-c nsnumber

2
推荐指数
1
解决办法
1558
查看次数

标签 统计

objective-c ×3

casting ×1

cocoa ×1

ios ×1

nsnumber ×1

ocunit ×1

unit-testing ×1