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

时间:2012-07-26 17:59:54

标签: objective-c ios unit-testing ocunit

我有一个OCUnit测试类:PatientTestViewControllerTests。以下是界面:

@interface PatientTestViewControllerTests : SenTestCase

@property (nonatomic, strong) PatientTestViewController *testController;

@end

和setUp:

- (void) setUp
{    
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Testing" bundle:nil];
    self.testController = [storyboard instantiateInitialViewController];
}

“测试”故事板是我应用中唯一的故事板,并被设置为应用的主要故事板。 PatientTestViewController被设置为故事板的唯一视图控制器。

我的测试课中有一个测试:

- (void) testInitialTestingStoryboardViewIsPatientTest
{
    STAssertTrue([self.testController isMemberOfClass:[PatientTestViewController class]], @"Instead of the %@, we have %@",[PatientTestViewController class], [self.testController class]);
}

此测试失败,并显示以下日志消息:

错误: - [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 class]也失败了。

  • 使用[self.testController isKindOfClass:[UIViewController class]] PASSES。

  • 使用[self.testController isMemberOfClass:[UIViewController class]] FAILS。

2 个答案:

答案 0 :(得分:9)

问题可能是您的视图控制器的.m文件包含在目标,应用程序和测试包中。 ocunit(以及像Kiwi这样的衍生产品)使用测试工具,使应用程序中包含的类可用于测试,而无需明确包含其实现。

包括两者都给了你同一个类的两个副本,这就是为什么它们具有相同的描述但不同的内存地址。

答案 1 :(得分:3)

您通常需要isKindOfClass:而不是isMemberOfClass:。不同之处在于,如果接收者是相关类的子类的成员,isKindOfClass:将返回YES,而isMemberOfClass:将在同一情况下返回NO。 / p>

您还可以使用[self.testController class] == [PatientTestViewController class]直接比较类。