Ошибка компоновщика: набор тестовых модулей iPhone ссылается на классы приложений - PullRequest
10 голосов
/ 11 ноября 2009

Начиная с приложения, которое уже находится в разработке, я выполнил инструкции, изложенные в Руководстве по разработке для iPhone - Приложения для модульного тестирования

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

Если я добавлю следующую строку кода:

STAssertTrue([viewController isKindOfClass:[LoginViewController class]], @"Top view controller is not LoginViewController");

Сгенерирована следующая ошибка сборки:

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

Я могу предоставить больше информации о конфигурации для проекта и цели тестирования, но файл установки работает без строки [LoginViewController class] в источнике теста.

Без этой строки я могу ссылаться на класс, использовать его свойства и успешно отправлять ему сообщения.

Существует ли параметр компоновки компоновки или параметр загрузки пакета, который требуется при попытке использовать класс App таким способом? Или я должен найти другой тип теста, чтобы подтвердить, что класс объекта является ожидаемым?

Ответы [ 2 ]

18 голосов
/ 13 ноября 2009

Я нашел ответ, но я думаю, что должен быть «лучший» способ?

В конфигурации сборки для пакета модульных тестов вы можете указать параметр Bundle Loader (BUNDLE_LOADER), который указывает на ваше "хостовое" приложение.

${TARGET_BUILD_DIR}/AppName.app/AppName

Пакет модульных тестов создается в зависимости от цели модульного тестирования вашего приложения (скажем, AppName Testing), и в результате я не смог разрешить исполняемый файл приложения лучше, чем указано выше.

Чистый результат - тест работающего модуля, введенный в цель тестирования без ошибок компоновщика. Тесты запускаются и получают доступ к классам, как и ожидалось.

РЕДАКТИРОВАТЬ: Bundle Loader - Конфигурация цели

Важно настроить цель, которая «размещает» тестовый пакет, на , а не скрыть его символы.

GCC_SYMBOLS_PRIVATE_EXTERN = NO

a.k.a. Msgstr "Символы скрыты по умолчанию". Из документации:

Когда включено, все символы объявляются 'private extern', если явно помечены для экспорта с использованием '__attribute__((visibility("default")))' в коде. Если не включен, все символы экспортируются, если явно не отмечено как 'private extern'.

Для получения дополнительной информации см. http://developer.apple.com/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html.

1 голос
/ 16 июля 2010

Я только что ответил здесь:

Модульное тестирование iPhone: символы не найдены при вызове пользовательского кода

Полагаю, один из них должен быть закрыт как дубликат? Я недостаточно авторитетен, чтобы сделать это ...


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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...