问题
I have an OCUnit Test class: PatientTestViewControllerTests. Below is the interface:
@interface PatientTestViewControllerTests : SenTestCase
@property (nonatomic, strong) PatientTestViewController *testController;
@end
and setUp:
- (void) setUp
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Testing" bundle:nil];
self.testController = [storyboard instantiateInitialViewController];
}
The 'Testing' storyboard is the only storyboard in my app, and is set as the app's main storyboard. The PatientTestViewController is set as the storyboard's only view controller.
I have one test in my test class:
- (void) testInitialTestingStoryboardViewIsPatientTest
{
STAssertTrue([self.testController isMemberOfClass:[PatientTestViewController class]], @"Instead of the %@, we have %@",[PatientTestViewController class], [self.testController class]);
}
This test fails with the following log message:
error: -[PatientTestViewControllerTests testInitialTestingStoryboardViewIsPatientTest] : "[self.testController isMemberOfClass:[PatientTestViewController class]]" should be true. Instead of the PatientTestViewController, we have PatientTestViewController
How can this be? Since
[self.testController isMemberOfClass:[PatientTestViewController class]]
is apparently false, how can the test log say that both
[self.testController class]
and [PatientTestViewController class]
look the same?
Additional Info:
- using
[self.testController isKindOfClass:[PatientTestViewController class]]
in the test also fails using
[self.testController class] == [PatientTestViewController class]
fails also.using
[self.testController isKindOfClass:[UIViewController class]]
PASSES.- using
[self.testController isMemberOfClass:[UIViewController class]]
FAILS.
回答1:
The problem is likely that your view controller's .m file is included in both targets, the app and the test bundle. ocunit (and derivatives like Kiwi) uses a test harness that makes the classes included in the app available to tests without having to explicitly include their implementation.
Including both has given you two copies of the same class, which is why they have the same description but different memory addresses.
回答2:
You generally want isKindOfClass:
and not isMemberOfClass:
. The difference is that isKindOfClass:
will return YES
if the receiver is a member of a subclass of the class in question, whereas isMemberOfClass:
will return NO
in the same case.
You could also directly compare the classes using [self.testController class] == [PatientTestViewController class]
.
来源:https://stackoverflow.com/questions/11675256/ismemberofclass-returns-no-when-viewcontroller-is-instantiated-from-uistoryboard