Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

isMemberOfClass returns no when ViewController is instantiated from UIStoryboard

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.
like image 544
churowa Avatar asked Dec 15 '22 21:12

churowa


1 Answers

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.

like image 60
nheagy Avatar answered Jan 12 '23 00:01

nheagy