Ответ 1
Мне нужно было установить свойство "Test Host" на целевом unit test на $(BUNDLE_LOADER)
. Это решило мою проблему!
ПРИМЕЧАНИЕ. "Использовать 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.
Я уже проверил, что:
Любые мысли о том, что может быть причиной этого?
Мне нужно было установить свойство "Test Host" на целевом unit test на $(BUNDLE_LOADER)
. Это решило мою проблему!
Я просто потратил часы на эту и подобные ошибки - оказалось, что я переименовал свою главную цель - попытки исправить это, переименовав соответствующие переменные и удалив весь каталог DerivedData, не увенчались успехом.
В итоге я просто создал новую цель unit test, выполнив следующие шаги: http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/
И теперь все в порядке.
Итак - если у вас есть странные, необъяснимые ошибки ссылок, вам может быть лучше просто создать новую цель unit test. Требуется 2 минуты.
Я сделал следующее:
http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/
Сделайте более глубокий взгляд на Test_Hosts = $(BUNDLE_LOADER)
Установка Test_Hosts исправила точно такую же проблему!
Когда я получаю ошибки компоновщика, выполняющие модульные тесты, две вещи исправляют проблему для меня. Первое решение - установить для параметра "Настройка после сборки" значение "ДА" и выбрать "Продукт" > "Создать для" > "Создать для тестирования" для запуска тестов. Это решение проще реализовать.
Второе решение - добавить файлы реализации приложения в цель unit test. Откройте инспектор файлов, выбрав "Просмотр" > "Утилиты" > "Инспектор файлов". Выберите файл реализации в навигаторе проекта. Установите флажок рядом с целью unit test в инспекторе файлов.
Для приложений iPhone, работающих в симуляторе, убедитесь, что параметр сборки тестового хоста пуст. Симулятор не поддерживает модульные тесты, размещенные на сервере.
У меня была одна и та же проблема. По какой-то причине один из исходных файлов для моего проекта также был включен для компиляции для тестовой цели, что вызывает эту ошибку ссылки.
Убедившись, что только файлы тестовой реализации скомпилированы, вы должны решить эту ошибку. Вы можете проверить это:
TestTarget → Фазы сборки → Скомпилировать источники
Произошла ошибка при использовании Xcode 4.5.2 - ноябрь 2012 г. - ни одна из вышеперечисленных проблем не работала. Кажется, что установка загрузчика пакетов и тестового хоста должна заполнять все зависимости от вашего проекта для вас - или запускать тесты в среде приложений или что-то в этом роде, но, к сожалению, я не работал у меня. То, что он сделал, это предотвратить определенные предупреждения Xcode о том, какие файлы/библиотеки отсутствовали.
Что сработало для меня, было добавление новой цели: cocoa touch unit test (убедитесь, что параметры загрузчика пакетов и тестовых хостов пустые), просмотр ошибок сборки и добавление вручную отсутствующих зависимостей - по одному один из всех исходных файлов из моего проекта, которые были необходимы, а затем Framework. Не очень элегантный, но я был счастлив заставить его работать. Не знаю, почему я еще не пробовал эту библиотеку GHUnit.
Убедитесь, что целевая целевая аудитория настроена как зависимая (Build Phases → Target Dependencies).
Я знаю, что этот вопрос довольно старый, но я некоторое время боролся с идентичной проблемой и, наконец, смог его решить, поэтому позвольте мне поделиться тем, что я нашел.
Я переносил приложение с iOS на Mac, сам проект был создан для iOS, поэтому у проекта и основной цели был iOS на поддерживаемых платформах. Теперь, когда я начал переносить, я создал новую цель для Mac и изменил поддерживаемые платформы на OSX только для этой цели. После этого я создал еще одну цель для модульных тестов, но забыл изменить поддерживаемые платформы с iOS на Mac. Я думаю, вы уже должны знать, в чем проблема, в основном цель тестирования модулей по умолчанию связана с фреймворком Cocoa, так как поддерживаемые платформы для этой цели были только iOS, инфраструктура Cocoa никогда не была построена и не была должным образом связана, Изменение поддерживаемых платформ для OSX для целевой задачи устранило проблему.
Я знаю, что это может быть не очень полезно для целевых объектов iOS, но, по крайней мере, пойдите в тестовую целевую ссылку Binary Binary With Libraries и посмотрите, есть ли какие-либо красные библиотеки. Это дало мне идею, возможно, это также поможет некоторым из вас.
Я столкнулся с этим после нескольких слияний в последнее время, когда у коллеги и у меня есть как добавленные файлы к проекту, так и не все файлы реализации являются частью целевой единицы тестирования.
Решение:
.m
(используйте "Фильтр в навигаторе" (cmd-opt-j) для поиска .m
)Примечание. Если флажок тестовой цели показывает -
вместо +
или неконтролируемый, это означает, что некоторые, но не все из выбранных файлов являются членами цели.
Я пытался делать более интеллектуальные вещи во время слияния с файлом .xcodeproj
project.pbxproj
, но каждый раз отказывался от разочарования своей непостижимостью и отказывался от этого метода.
(Другое примечание: я выбираю только несколько файлов одновременно по двум причинам: