Модульное тестирование iPhone: символы не найдены при вызове пользовательского кода - PullRequest
1 голос
/ 06 января 2010

Я пытаюсь настроить модульное тестирование для своего приложения iPhone. Я следовал документации Apple Unit Testing , и она проснулась, но как только я добавил другой класс в этот тест, я получил следующую ошибку:

  "_OBJC_CLASS_$_RootViewController", referenced from:
      __objc_classrefs__DATA@0 in AppDelegateTests.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Само приложение является базовым навигационным приложением с Базовыми данными для хранения данных.

Юнит-тест выглядит следующим образом:

#import <SenTestingKit/SenTestingKit.h>
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

#import "HSStabilityAppAppDelegate.h"
#import "RootViewController.h"
@interface AppDelegateTests : SenTestCase {
 HSStabilityAppAppDelegate *appDelegate;
}
@end


@implementation AppDelegateTests
// all code under test must be linked into the Unit Test bundle


#pragma mark -
#pragma mark Set up and tearDown

#if APPLICATION_TESTS
- (void) setUp {
 appDelegate = (HSStabilityAppAppDelegate *)[[UIApplication sharedApplication] delegate];
 STAssertNotNil(appDelegate, @"Cannot find the application delegate.");
}

- (void) tearDown {
 [appDelegate release];
}

#else

#endif


#pragma mark -
#pragma mark Tests

#if APPLICATION_TESTS

- (void) testRootViewIsOnTop {
 id topViewControllerClass = [[appDelegate.navigationController topViewController] class];
 id rootViewControllerClass = [RootViewController class];
 STAssertEquals(topViewControllerClass, rootViewControllerClass, @"Root view controller was not the top class");
}

#endif

@end

Если я закомментирую строку id rootViewControllerClass, тогда программа установит правильные ссылки. Кроме того, это происходит только при сборке с целью устройства, у меня не возникает проблем при сборке с помощью симулятора (возможно, учитывая, что тесты приложений не работают на симуляторе).

Может ли кто-нибудь помочь решить эту основную и очень раздражающую проблему?

Ответы [ 2 ]

4 голосов
/ 16 июля 2010

Я также следовал документу Приложения для Apple iPhone Unit-Testing и обнаружил ошибку компоновки, аналогичную описанной в вопросе, при попытке выполнить модульное тестирование одного из моих классов.

Похоже, что любой класс, на который есть ссылка в вашем классе модульных тестов, должен быть добавлен к этой цели тестирования. Для этого щелкните правой кнопкой мыши свой класс RootViewController и выберите «Получить информацию» (ярлык Cmd-i). На панели целей убедитесь, что выбран целевой объект модульного теста (например, «LogicTests», если вы следовали наименованию в этом документе).

Теперь этот класс будет скомпилирован с вашими тестами и должен быть доступен для вашего модульного теста. Для двойной проверки разверните узел «Targets / LogicTests / Compile Resources» в браузере «Groups & Files» слева. Здесь перечислены все файлы классов, доступные при создании цели, и теперь они должны включать ваш класс модульного теста вместе с тестируемым классом.

(Обратите внимание, что вам нужно аналогичным образом выбрать все подходящие цели при создании нового приложения или класса тестирования - на той же странице окна «Новый файл ...», когда вы называете файл).

(кстати, я использую XCode 3.2.3 и OS 4.0).

1 голос
/ 08 января 2010

Мне кажется, я нашел ответ. Проблема в том, что, хотя компилятор может видеть определения, он не выглядит в нужном месте, когда связывает их, и поэтому выдает эти ошибки. Поэтому, если мы переместим разрешение имени класса во время выполнения, мы можем обойти все это.

Вместо: NSManagedObject использование: NSClassFromString("@NSManagedObject")

Это относится практически ко всем классам, определенным внутри.

Если кто-нибудь скажет мне, как заставить его работать во время компиляции, я все равно буду очень благодарен.

...