Ошибка компоновщика модульного тестирования Xcode 4

ПРИМЕЧАНИЕ: «Использовать GHUnit» не является приемлемым ответом на этот вопрос. Я знаю, что большинство думает, что GHUnit лучше, чем Xcode4 OCUnit, но я спрашиваю не об этом. Я оцениваю это отдельно.

У меня есть проект Xcode, который я создал в Xcode4 с нуля, с флажком «Включить модульные тесты», установленным во время создания. Я также включил некоторые библиотеки, разработанные мной в предыдущем проекте. Они были добавлены в проект через диалоговое окно «Добавить файлы в x ...» и добавлены только в цель приложения (а не в цель тестирования). Они нормально работают при запуске приложения, поэтому я считаю, что они настроены правильно. У меня также есть несколько различных классов, написанных для этого проекта.

Мои тестовые файлы настроены стандартным образом и называются [AppName] Tests.h и .m.
Код для заголовка:
#import < SenTestingKit/SenTestingKit.h >

@interface [AppName]Tests : SenTestCase {
@private
}
@end

Код для реализации:
#import "[AppName]Tests.h"

@implementation [AppName]Tests

- (void)setUp
{
    [super setUp];
    // Set-up code here.
}

- (void)tearDown
{
    // Tear-down code here.
    [super tearDown];
}  
// Test methods go here
@end

Это всего лишь базовый скелет. Он отлично работает в моем другом проекте, и в этом проекте, если я не импортирую другие файлы. Когда я импортирую другой файл из этого проекта и использую его, я вижу следующую ошибку в журнале вывода Xcode:
The test bundle at /Users/[Me]/Library/Developer/Xcode/DerivedData/[AppName]-dwuuuwcpmdqxqmgxomoniplwhlpb/Build/Products/Debug-iphonesimulator/[AppName]Tests.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.

Я уже подтвердил, что:

  1. Все используемые мной фреймворки были добавлены в раздел «Связать двоичный файл с библиотеками» как для приложения, так и для целей тестирования.
  2. Тестовая цель настроена для правильной сборки, и все мои тестовые методы отображаются в Edit Scheme ...-> Test-> Tests
  3. Все проблемы, кроме этой, были решены, и ошибок компилятора нет.
  4. Все параметры, обсуждаемые здесь, настроены правильно и идентичен другому моему проекту, который тестируется правильно.

Есть мысли о том, что может быть причиной этого?


person Kongress    schedule 07.06.2011    source источник
comment
У меня такая же проблема. Тесты работают нормально, пока вы не выделите объект из ведущего приложения. Был в тупике весь день :(   -  person Sam    schedule 28.07.2011
comment
@Sam Я был в тупике добрых полтора месяца: P В конце концов я просто сдался и протестировал старомодным способом. Может быть, новый Xcode исправит это, кто знает. Но дайте нам знать, если найдете что-нибудь.   -  person Kongress    schedule 28.07.2011
comment
Как и многие до меня, я сдался и теперь использую GHUnit. На настройку ушло около 10 минут.   -  person Sam    schedule 29.07.2011


Ответы (9)


Мне пришлось установить свойство «Test Host» на целевом объекте unit test на $(BUNDLE_LOADER). Это решило мою проблему!

person Sam Grossberg    schedule 12.09.2012
comment
У меня не был этот набор, и настройка, похоже, сделала это. Он запускает приложение в симуляторе iOS во время выполнения тестов, что кажется странным ... но теперь мои тесты действительно выполняются. - person Ben Kreeger; 18.09.2012

Я просто потратил часы на эту и подобные ошибки - оказывается, я переименовал свою основную цель - попытки исправить это, переименовав соответствующие переменные и удалив весь каталог DerivedData, не увенчались успехом.

В конце концов я просто настроил новую цель модульного теста, выполнив следующие действия: http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

И теперь все нормально.

Итак - если у вас есть странные, необъяснимые ошибки ссылок, возможно, вам лучше просто создать новую цель модульного теста. Всего 2 минуты.

person n13    schedule 03.03.2012
comment
Мне придется попробовать это, если я когда-нибудь снова вернусь к этому проекту / платформе. - person Kongress; 07.03.2012
comment
Спасибо! Я тоже потратил впустую часы, и в конце концов это простое решение сработало для меня. - person Giuseppe Galano; 25.08.2015

Я сделал следующее:
http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

Взгляните подробнее на Test_Hosts = $ (BUNDLE_LOADER)

Установка Test_Hosts решила точно такую ​​же проблему!

person Alexander    schedule 02.10.2012
comment
Отличная ссылка. Действительно ценная информация. - person Andrew; 04.01.2013
comment
Двойные кавычки вокруг моего пути TEST_HOSTS завершились неудачно, одинарные кавычки вокруг моего пути TEST_HOSTS завершились неудачно, кавычки НЕ работают. Между прочим, в моей системе на этом пути нет пробелов. - person Robert Atkins; 13.05.2013
comment
Прочитав эту статью, я решил мою проблему. На вкладке «Параметры сборки» для параметра «Загрузчик пакетов» должно быть указано имя вашего приложения: $(BUILT_PRODUCTS_DIR)/MyExistingApp.app/MyExistingApp - person Richard H Fung; 05.10.2013
comment
Это помогло мне настроить тестовую цель и в XCode 5, то, что xcode не сделал для меня, что вызывало проблемы, когда я пытался протестировать код своего приложения, было последним шагом, символы, скрытые по умолчанию, должны быть НЕТ в основная цель приложения. - person Jason; 09.10.2013

Когда я получаю ошибки компоновщика при выполнении модульных тестов, для меня проблема решается двумя вещами. Первое решение - установить для параметра сборки Test After Build значение YES и выбрать Product> Build For> Build For Testing, чтобы запустить тесты. Это решение проще реализовать.

Второе решение - добавить файлы реализации приложения в цель модульного теста. Откройте инспектор файлов, выбрав «Просмотр»> «Утилиты»> «Инспектор файлов». Выберите файл реализации в навигаторе проекта. Установите флажок рядом с целью модульного теста в инспекторе файлов.

Для приложений iPhone, работающих в симуляторе, убедитесь, что параметр сборки Test Host пуст. Симулятор не поддерживает модульные тесты, размещаемые в приложении.

person Mark Szymczyk    schedule 07.06.2011
comment
Спасибо за совет, но, к сожалению, ни один из этих методов не помог решить проблему. Оба в конечном итоге закончились той же ошибкой компоновщика, что и раньше. Думаю, пора рассмотреть альтернативы ... - person Kongress; 08.06.2011
comment
@Kongress ... Если этот ответ не сработал, то почему вы его приняли? Кроме того, вы когда-нибудь находили решение? - person PengOne; 20.06.2011
comment
@PengOne Вопрос стоял неделями, и это был единственный ответ, который я получил. Хотя это не устранило мою конкретную проблему, оно было исчерпывающим и полезным. Из SO FAQ: Когда вы решили, какой ответ наиболее полезен для вас, отметьте его как принятый ... Нет четкого указания, как долго ждать этого, поэтому я взял на себя инициативу. Если я справился с этим неправильно, сообщите мне, чтобы я мог воспользоваться им в будущем. - person Kongress; 21.06.2011
comment
@Kongress ... Ответы принимаются исключительно на ваше усмотрение. У меня был аналогичный вопрос, и я нашел ваш при поиске. Поскольку есть принятый ответ, я решил, что проблема решена. Лично я принимаю ответ только тогда, когда он решает проблему, чтобы предупредить других о том, что вопрос все еще открыт. Однажды я получил правильный ответ 2 месяца спустя, и я думаю, что человек, возможно, не беспокоился, если бы я принял нерабочий ответ. Повторяю, принятие и голосование полностью на ваше усмотрение. Я спросил в надежде, что вы действительно нашли решение. - person PengOne; 21.06.2011

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

Убедившись, что скомпилированы только файлы тестовой реализации, вы сможете устранить эту ошибку. Вы можете проверить это по адресу:

TestTarget -> Этапы сборки -> Исходные коды компиляции

person Zypher    schedule 20.01.2012
comment
Отличный ответ. Это устранило проблему, с которой я столкнулся при компиляции пакета модульного теста. - person Mark Struzinski; 30.06.2012
comment
Мне пришлось пойти прямо противоположным путем: ошибка компоновщика исчезла только после того, как я добавил все исходные файлы проекта в тестовую цель. Удаление любого исходного файла из целевого приводит к повторному появлению ошибки компоновщика. - person Pieter Kuijpers; 13.09.2012

Обнаружил эту ошибку при запуске Xcode 4.5.2 - это ноябрь 2012 г. - ничего из вышеперечисленного не сработало. Кажется, что установка загрузчика пакетов и тестового хоста должна заполнить все зависимости из вашего проекта за вас - или запустить тесты в среде вашего приложения или что-то в этом роде, но, к сожалению, у меня это не сработало. Что он сделал, так это предотвратил конкретные предупреждения Xcode о том, какие файлы / библиотеки отсутствуют.

Что сработало для меня, так это добавление новой цели: какао-сенсорный модульный тест (убедитесь, что загрузчик пакетов и настройки сборки тестового хоста пусты), просмотр ошибок сборки и ручное добавление недостающих зависимостей - один за другим все исходные файлы из мой проект, который был нужен, а затем Frameworks. Не очень элегантно, но я был просто счастлив, что он заработал. Не уверен, почему я еще не пробовал эту библиотеку GHUnit.

person Colin    schedule 20.11.2012

Убедитесь, что у тестовой цели есть цель приложения, настроенная как зависимость (Фазы сборки -> Целевые зависимости).

person bosmacs    schedule 21.06.2011

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

Я портировал приложение с iOS на Mac, сам проект был создан для iOS, поэтому и проект, и основная цель имели iOS на поддерживаемых платформах. Теперь, когда я начал портировать, я создал новую цель для Mac и изменил поддерживаемые платформы на OSX только для этой цели. После этого я создал еще одну цель для модульных тестов, но забыл сменить поддерживаемые платформы с iOS на Mac. Я думаю, вы уже должны знать, в чем была проблема, в основном цель модульных тестов по умолчанию связана с платформой Cocoa, поэтому, поскольку поддерживаемыми платформами для этой цели была только iOS, структура какао никогда не была создана и не была должным образом связана. Смена поддерживаемых платформ на OSX для тестовой цели устранила проблему.

Я знаю, что это может быть не очень полезно для тестовых целей iOS, но, по крайней мере, перейдите в раздел Link Binary With Libraries для своей тестовой цели и посмотрите, есть ли какие-нибудь красные библиотеки. Это натолкнуло меня на мысль, может быть, это также поможет некоторым из вас.

person lawicko    schedule 07.09.2012

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

Решение:

  1. Выберите небольшой диапазон ваших .m файлов (используйте «Фильтр в навигаторе» (cmd-opt-j) для поиска .m)
  2. Показать файловый инспектор (cmd-opt-1) для просмотра целевого членства файлов
  3. Убедитесь, что соответствующие файлы входят в вашу тестовую цель.

Примечание: если флажок тестовой цели показывает - вместо + или не отмечен, это означает, что некоторые, но не все, выбранные файлы являются членами цели.

Я пробовал делать более разумные вещи во время слияния с файлом .xcodeproj project.pbxproj, но я каждый раз разочаровывался в его непостижимости и снова прибегал к этому методу.

(Еще одно замечание: я выбираю только несколько файлов за раз по двум причинам:

  • Низкая производительность Xcode для файлового инспектора при выборе более 7–10 файлов.
  • Некоторые файлы не входят и не должны входить в тестовую цель, и проще выполнить процесс исключения, когда выбранный диапазон невелик)
person cbowns    schedule 27.06.2013