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

我有一个OCUnittesting类:PatientTestViewControllerTests。 以下是界面:

@interface PatientTestViewControllerTests : SenTestCase @property (nonatomic, strong) PatientTestViewController *testController; @end 

和setUp:

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

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

我在testing课上有一个testing:

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

此testing失败并显示以下日志消息:

错误: – [PatientTestViewControllerTests testInitialTestingStoryboardViewIsPatientTest]:“[self.testController isMemberOfClass:[PatientTestViewController class]]”应为true。 而不是PatientTestViewController ,我们有PatientTestViewController

怎么会这样? 以来

[self.testController isMemberOfClass:[PatientTestViewController class]]

显然是错误的,testing日志怎么说呢

[self.testController class][PatientTestViewController class]

看起来一样?

附加信息:

  • 在testing中使用[self.testController isKindOfClass:[PatientTestViewController class]]也失败
  • 使用[self.testController class] == [PatientTestViewController class]也失败。

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

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

问题可能是您的视图控制器的.m文件包含在目标,应用程序和testing包中。 ocunit(和Kiwi等衍生产品)使用testing工具,使应用程序中包含的类可用于testing,而不必明确包含其实现。

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

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

您也可以直接使用[self.testController class] == [PatientTestViewController class]