Подтвердить что ты не робот

IsKindOfClass и NSStringFromClass не согласны с UIApplicationDelegate

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

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

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

- (void)testAppDelegate 
{
    id appDelegate = [[UIApplication sharedApplication] delegate];
    NSLog(@"app delegate 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 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).
4b9b3361

Ответ 1

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

EDIT: Просто понял, что вам не нужна цель CalculatorTesting в Xcode 4. Просто зайдите в Project > Edit Schemes... и убедитесь, что пакет unit test указан в тесте раздел. Затем вы можете запускать модульные тесты с помощью Cmd-U.

Ответ 2

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

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

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

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

не уверен, что это поможет, но его отправной точкой