Грешка в свързващия модул за тестване на 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. Тестовата цел е конфигурирана да се изгражда правилно и че всички мои тестови методи се показват в Редактиране на схема...->Тест->Тестове
  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)


Трябваше да задам свойството „Тестов хост“ на целта за тест на единица на $(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
Прочитането на тази статия реши проблема ми. Разделът Настройки за компилация трябва да има настройката Bundle Loader, зададена на името на вашето приложение: $(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, работещи в симулатора, уверете се, че настройката за изграждане на тестов хост е празна. Симулаторът не поддържа единични тестове, хоствани от приложения.

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 за това кои файлове/библиотеки липсват.

Това, което проработи за мен, беше добавянето на нова цел: cocoa touch unit test (като се уверя, че зареждането на пакета и настройките за изграждане на тестовия хост са празни), наблюдавам грешките при компилиране и ръчно добавям липсващите зависимости - един по един всички изходни файлове от моя проект, който беше необходим и след това Frameworks. Не е много елегантно, но просто бях щастлив, че го накарах да работи. Не знам защо все още не съм пробвал тази библиотека GHUnit.

person Colin    schedule 20.11.2012

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

person bosmacs    schedule 21.06.2011

Наясно съм, че този въпрос е доста стар, но току-що се борих с идентичен проблем известно време и най-накрая успях да го разреша, така че нека споделя какво открих.

Пренасях приложение от iOS към Mac, самият проект беше създаден за iOS, така че и проектът, и основната цел имаха iOS в поддържани платформи. Сега, когато започнах да пренасям, създадох нова цел за Mac и промених поддържаните платформи на OSX само за тази цел. След това създадох друга цел за модулни тестове, но забравих да променя поддържаните платформи от iOS на Mac. Мисля, че вече трябва да знаете какъв е проблемът, основно целта за единични тестове е свързана по подразбиране с рамката на какао, така че тъй като поддържаните платформи за тази цел бяха само iOS, рамката на какаото никога не е била изграждана и не е била правилно свързана. Промяната на поддържаните платформи на OSX за тестовата цел отстрани проблема.

Наясно съм, че това може да не е много полезно за целите за тестване на iOS, но поне отидете на вашата цел за тест Свързване на двоични файлове с библиотеки и вижте дали има някакви червени библиотеки. Това ми даде идеята, може би ще помогне и на някои от вас.

person lawicko    schedule 07.09.2012

Сблъсках се с това след няколко сливания напоследък, когато и аз, и колега добавихме файлове към проекта и не всички файлове за внедряване са членове на целта за тестване на единици.

Решението:

  1. Изберете малък диапазон от вашите .m файлове (използвайте „Филтър в навигатора“ (cmd-opt-j), за да търсите .m)
  2. Покажете File Inspector (cmd-opt-1), за да видите целевото членство на файловете
  3. Уверете се, че подходящите файлове са член на вашата тестова цел.

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

Опитвал съм да правя по-интелигентни неща по време на сливане с project.pbxproj файла на .xcodeproj, но всеки път съм се отказвал от разочарование от неговата неразгадаемост и съм се връщал към този метод.

(Друга забележка: избирам само няколко файла наведнъж поради две причини:

  • Производителността на Xcode за файловия инспектор при избиране на повече от 7–10 файла е лоша
  • Някои файлове не са и не трябва да бъдат член на тестовата цел и е по-лесно да се направи процес на елиминиране, когато избраният диапазон е малък)
person cbowns    schedule 27.06.2013