Ошибка компоновщика: набор тестовых модулей iPhone ссылается на классы приложений

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

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

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

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

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

Undefined symbols:
  "_OBJC_CLASS_$_LoginViewController", referenced from:
      [email protected] in LoginViewTest.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

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

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

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

Ответы на вопрос(2)

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

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

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

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

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

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

(Я'используя XCode 3.2.3 ОС 4.0, кстати).

 ohhorob16 июл. 2010 г., 00:22
Ваши заметки в целом в порядке. Но они нене отвечайте на вопрос, который я задал. В моем вопросе и ответе речь идет о символах, которые можно получить из пакета введенных модульных тестов во время соединения. Это также ошибка, указанная в другом вопросе, на который вы ссылаетесь. Ваш ответ является важной частью настройки "тестирование» цель, но в обоих наших случаях это не вызывало никаких проблем.
Решение Вопроса

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

${TARGET_BUILD_DIR}/AppName.app/AppName

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

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

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

Это'Важно настроить цель, которая "хостинг» тестовый комплектне скрыть'с символами.

GCC_SYMBOLS_PRIVATE_EXTERN = NO

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

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

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

 Ben Challenor29 июн. 2011 г., 18:36
Это указало мне правильное направление, спасибо. Моя проблема заключалась в том, что я изменилНаименование товара" в основной цели, и поэтому мне пришлось обновить "Bundle Loader " в контрольной цели.
 Sam28 июл. 2011 г., 17:04
Отличный ответ, большое спасибо. Не очень интуитивно понятно, когда вы настраиваете тестирование для существующего проекта. Во всяком случае, это работает сейчас! Кроме того, мне потребовалось некоторое время, чтобы найти настройку Bundle Loader, убедитесь, чтоВсе' проверяется в верхней части настроек сборки, а неОсновные»
 DougW19 окт. 2011 г., 02:51
Тьфу наконец Я сделал то же самое и знал, что происходит, но я не могНа всю жизнь найди эту чертову настройку, чтобы исправить это. Большое спасибо.

Ваш ответ на вопрос