Ошибка связывания для модульного тестирования с XCode 4?

Я хочу написать несколько модульных тестов логики для классов в моем приложении XCode. В Xcode 4 я щелкнул имя проекта в навигаторе проекта, а снизу щелкнул «Добавить цель». Я выбрал «Пакет для тестирования модулей какао» в разделе «Другое», дал новой цели «название продукта» «тесты» и закончил.

Поскольку класс, который я хочу протестировать, скомпилирован как часть моей существующей цели приложения, для моей новой цели «тестов» я немедленно перехожу на вкладку Build Phases и добавляю существующую цель приложения в качестве единственной целевой зависимости.

Затем я перехожу к созданному файлу tests.m, импортирую класс, который хочу протестировать (ниже ReleasePlanManager, и вызываю один из его методов. Но компоновщик выдает ошибку, например:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_ReleasePlanManager", referenced from:
      objc-class-ref in tests.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

Значит, класс не может быть найден, хотя (насколько я понимаю) добавления цели приложения (частью которой он является) должно быть достаточно?

Любая помощь будет принята с благодарностью. Спасибо!


person shadowmatter    schedule 23.06.2011    source источник
comment
ссылка: stackoverflow.com/questions/6397763/   -  person Matt - sanemat    schedule 25.06.2011


Ответы (1)


Ваш тестовый пакет требует дополнительных настроек:

  • Установите для Bundle Loader значение $(BUILT_PRODUCTS_DIR)/AppName.app/AppName (заменив AppName в обоих местах именем вашего приложения)
  • Установите Тестовый хост на $(BUNDLE_LOADER)

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

person Jon Reid    schedule 03.09.2011
comment
Также стоит отметить, что цель вашего хост-приложения не должна быть настроена для символов, скрытых по умолчанию (в разделе Генерация кода настроек сборки) для Конфигурации, с которой вы выполняете свои тесты. . Это просто сбило меня с толку сегодня утром на более старом приложении. - person Blake Watters; 12.01.2012
comment
Я последовал вашим предложениям и предложениям Блейка Уоттерса, теперь он дает мне: -bundle_loader можно использовать только с -bundle, есть идеи? - person ; 30.04.2012
comment
(может быть, я столкнулся с этим, потому что я использую GHUnit, а не SenTestingKit?) - сейчас я включаю необходимые источники как в основную цель, так и в тестовую цель. - person ; 30.04.2012
comment
(извините за рассылку спама) ищу здесь stackoverflow.com/questions/2610670/, я думаю, что добавление источников к обеим целям - единственное решение, и это то, что я действительно не хочу делать - person ; 30.04.2012
comment
@ishaq, этот другой ответ предшествует поддержке Xcode 4 для внедрения тестов в приложение. Я не использую GHUnit, но не могу поверить, что он упустил бы эту функцию. Похоже, ваша тестовая цель может быть неправильного типа. Я бы попытался воссоздать его с нуля, обязательно выбрав Unit Testing Bundle. Затем посмотрите, сможете ли вы запустить один тест, который зависит от класса в вашем приложении. - person Jon Reid; 30.04.2012
comment
@JonReid очень плохо, я не могу использовать целевой тип Unit Test Bundle, GHUnit требует, чтобы целевой тип был своего рода приложением (поскольку у него есть собственный графический интерфейс, что является одной из функций, которые я хочу). добавление источников как в основную, так и в тестовую цели: / - person ; 01.05.2012
comment
@BlakeWatters Ты молодец !! Действительно, установка для символов, скрытых по умолчанию значения НЕТ дала результат! (Документы говорят, что по умолчанию ДА) - person nacho4d; 01.05.2012
comment
Еще одна вещь, которую следует отметить в Xcode 4, - это то, что есть 2 столбца для установки параметров сборки. Убедитесь, что вы настроили его на цель, а не на проект. - person xster; 04.07.2012
comment
@ishaq ты когда-нибудь придумал, как это обойти? по поводу GHUnit? - person mkral; 16.01.2013
comment
@mkral no :( В итоге я включил источники для обеих целей. - person ; 24.01.2013