isKindOfClass и NSStringFromClass не согласны с UIApplicationDelegate - PullRequest
14 голосов
/ 19 марта 2011

Я играл с простым тестом OCUnit для приложения для iPhone, и просто хотел утверждать, что делегат приложения был экземпляром класса, как я и ожидал.Я не ожидал, что этот тест будет очень полезным, но оказалось, что он выявил недопонимание, которое у меня есть относительно Цели C.

Сначала я получаю ссылку на делегата.Затем я регистрирую имя класса того, что возвращается.В моем случае в выводе правильно указано «имя класса делегата приложения - CalculatorAppDelegate».

Однако утверждение на следующей строке не выполняется, и я не понимаю, почему.

- (void)testAppDelegate 
{
    id appDelegate = [[UIApplication sharedApplication] delegate];
    NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class]));
    NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);
    NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);
    NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]);
    STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf");
}

Какие обстоятельства могут привести к тому, что NSStringFromClass () вернет правильное имя класса, а isKindOfClass вернет false?

2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0
2011-03-19 15:51:13.865 Calculator[40092:207] class == class 0
/Users/pohl/Developer/FoundationCalculator/CalculatorTests/CalculatorBrainTests.m:37: error: -[CalculatorBrainTests testAppDelegate] : "[appDelegate isKindOfClass:[CalculatorAppDelegate class]]" should be true. wtf
Test Case '-[CalculatorBrainTests testAppDelegate]' failed (0.002 seconds).

Ответы [ 2 ]

12 голосов
/ 20 марта 2011

Вы не правильно настроили цель тестирования. Если вы следовали этому руководству для приложений модульного тестирования , у вас должно быть 3 цели: Calculator , CalculatorTests и CalculatorTesting . Проверьте раздел «этапы сборки» в CalculatorTests . В 'Compile Sources' должны быть указаны только исходные файлы SenTestCase . Я полагаю, что вы добавили туда CalculatorAppDelegate.m и другие файлы - это приведет к дублированию сборок с одинаковыми исходными файлами, которые затем будут связаны с тем же приложением при создании цели CalculatorTesting, Это объясняет, почему ваши утверждения не верны.

РЕДАКТИРОВАТЬ: Только что понял, что вам не нужна цель CalculatorTesting в Xcode 4. Просто зайдите в Project> Edit Schemes ... и убедитесь, что пакет модульного тестирования перечислены в разделе Test . Затем вы можете запустить модульные тесты с помощью Cmd-U.

1 голос
/ 19 марта 2011

попробуйте выйти из системы, каково возвращаемое значение операции

NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);

, и вы даже можете проверить, является ли она членом:

NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);

, не уверенный, поможет ли это, но этоначальная точка

...