当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]
。