XCTest / XCTest.h не знайдено на старих проектах, побудованих у Xcode 6


82

У мене є кілька проектів, які я намагаюся побудувати за допомогою Xcode 6 Beta 2. Усі проекти мають певний тип бібліотеки, яка використовує XCTest (Kiwi / XCTest та Specta), яка не будується в Xcode 6, оскільки XCTest / XCTest.h не може бути знайденим.

fatal error: 'XCTest/XCTest.h' file not found
#import <XCTest/XCTest.h>

Я помітив, що XCTest.framework більше немає в списку фаз побудови "Пов’язати бібліотеки з двійковими файлами", але це нормально, тому що коли я створюю новий проект із Xcode 6, здається, бібліотека автоматично пов’язана.

Можливо, з деякої релевантності, всі мої залежності, що потребують XCTest, надходять через Cocoapods.

Чи є щось, про що я не знаю, що мені потрібно оновити своїм проектом?

Відповіді:


142

Примітка: Це може не знадобитися для будь-яких проектів, створених у Xcode 7.

CocoaPods вирішили це тут і тут


Для того, щоб виправити це для будь-яких залежностей CocoaPod, вам потрібно додати наступне FRAMEWORK_SEARCH_PATHSв будь-яку ціль Pod, яка вимагає XCTest (наприклад, Kiwi, Specta, FBSnapshotTestCase тощо).

$(PLATFORM_DIR)/Developer/Library/Frameworks

скріншот

Це дозволить вам посилатися на XCTest у будь-яких залежностях, які ви можете мати. Це може бути виправлено в майбутньому оновленні CocoaPods або в Pod, на який ви посилаєтесь, тому ви можете видалити його пізніше.

Це не шкодить попереднім версіям Xcode, тому має бути безпечним у використанні.


Дякую квадратику. Відповідне питання тут
фатухоку

1
Коли заплановано наступний випуск?
fatuhoku

6
Здається, це не працює з KIM у xcode 6 GM ..?
Thomas Clowes

3
Я не згоден із "не стосується Xcode 7". У мене виникла проблема в Xcode 7.1. Проблема зникла після того, як я додав цей фреймворковий шлях пошуку, як зазначено вище. Я припускаю, що проект, розпочатий у Xcode 7, не матиме проблеми, але питання тут полягає у створенні старих проектів у нових Xcode.
Джеррі Кринок

1
станом на XCode 9 ви повинні встановити налаштування збірки FRAMEWORK_SEARCH_PATHS на $ (DEVELOPER_FRAMEWORKS_DIR) і $ (успадковано)
Бербі

40

Я переміщував файли в проекті. Все, що вам потрібно зробити, це вибрати свої тестові файли xxxTests.mтощо, і file inspectorвибрати targetяк, testа не як звичайну ціль.


1
Саме те, що сталося зі мною. Я не помітив, що при переміщенні його ціль для файлу "змінилася". Я повинен був подумати про це, виходячи з того, як його було переміщено (видалити в Xcode і повторно додати). Дякую.
chadbag

1
проста відповідь, яка у мене спрацювала. У мене були проблеми, коли я перейменовував свої файли, і це було рішення у моєму випадку.
Саймон

17

Я помітив, що XCTest доступний лише для тестової цілі (у Xcode 6). Якщо ви використовуєте XCTest для будь-якої іншої цілі (з якоїсь причини), ви побачите XCTest.h not foundпомилку.


Це воно. Cocoapods створює статичні бібліотечні проекти / цілі. Гарна знахідка!
Ерік Кербер,

1
Швидше за все, вам доведеться перемістити весь код, пов’язаний з XCTest, до тестової цілі.
Мустафа

Що важко, якщо ви використовуєте CocoaPods, щоб включити у свій проект ківі чи Specta.
squarefrog

2
Отже ... у чому виправлення?
fatuhoku

12

Ця помилка виникає, коли ви додали файл, де XCTest використовується поза тестовою метою. Щоб виправити це в AppCode, ви можете клацнути правою кнопкою миші на будь-якому підозрілому файлі та вибрати "Керувати цілями", а потім переконатися, що встановлено лише тестове завдання.


Я не раз стикався з цією проблемою.
пшах

Це трапилося зі мною після переміщення файлів у проекті та повторного додавання їх під неправильну ціль.
Giles

11

@squarefrog має правильну відповідь, але вам доведеться продовжувати робити це вручну кожного разу, коли ви оновлюєте свої підсистеми :(

Якщо ви додасте це до свого підфайлу, він автоматично додасть додатковий шлях для вас. Наприклад, якщо ви хочете додати $(PLATFORM_DIR)/Developer/Library/Frameworksдо FRAMEWORK_SEARCH_PATHSSpecta:

post_install do |installer|
    target = installer.project.targets.find { |t| t.to_s == "Pods-Tests-Specta" }
    if (target)
        target.build_configurations.each do |config|
            s = config.build_settings['FRAMEWORK_SEARCH_PATHS']
            s = [ '$(inherited)' ] if s == nil;
            s.push('$(PLATFORM_DIR)/Developer/Library/Frameworks')
            config.build_settings['FRAMEWORK_SEARCH_PATHS'] = s
        end
    else
        puts "WARNING: Pods-Tests-Specta target not found"
    end
end

Зауважте, що вам може знадобитися змінити, "Pods-Tests-Specta"щоб відповідати вашим параметрам проекту, або просто скористатися циклом, який @squarefrog запропонував переглядати кожну ціль.
pix0r

1
Я помиляюсь - @squarefrog не запропонував петлі. Що я маю на увазі, це замінити рядки 2-3 у рішенні @ deanWombourne на: installer.project.targets.each do |targetдля обведення всіх цілей та застосування змін.
pix0r

2

Я зіткнувся з такою ж проблемою через деякий час, я імпортував фреймворк XCTest з фаз побудови та вирішив проблему.

Фази побудови-> XCTest.Framework> очистити та запустити. Сподіваюся, це комусь буде корисно ..

для довідки ... Імпортуйте XCTest до існуючого проекту


Це працювало для мене, але мені також довелося перейти до налаштувань цілі для нових тестів і на вкладці Загальне встановити прапорець для тестування API програми.
Fran K.

1

На момент написання останньої версії Cocoapods (0.33.1) проблема не вирішена.

Але передова версія робить це.

Дотримуйтесь цього посібника, щоб встановити останню версію Cocoapods з джерела. Я називаю свою pod-dev(описану в посібнику), щоб відрізнити її від встановленої самоцвітом версії стручків.

Перевага цього підходу полягає в тому, що вам не потрібні додаткові сценарії у вашому підфайлі. Потрібно лише пам’ятати робити pod-dev installзамість звичного pod install.


1

Найкращий спосіб отримати XCTest - це додати його з тестового навігатора (5-й значок на лівій панелі).

Таким чином, новий xx.mтестовий файл націлений не на (на правій панелі) додаток (на лівій панелі> Ціль, Розширення обгортки: додаток), а на пакет (Розширення обгортки: xctest)

  • XCTest.framework залишається червоним,
  • через деякі модифікації ви можете мати помилку 'XCTest/XCTest.h' file not found, це тому, що ваш файл повинен був націлити додаток.

0

Це найпростіший обхід, який я знайшов. Жодні зміни проекту не потрібні. І ці зміни зберігатимуться до наступного оновлення Xcode:

cd /Applications/Xcode6-Beta7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks
ln -s ../../../../../Library/Frameworks/XCTest.framework

Недоліком цього є те, що якщо ви ділитеся своїм проектом з іншими, оскільки вам потрібно змусити їх виконати цю дію, кожного разу, коли відбувається оновлення Xcode. Це проблема з реалізацією Cocoapods, тому має сенс вирішити її за допомогою Cocoapods!
squarefrog

Домовились. І це не ідеально. Але це дуже просто і добре масштабується з урахуванням кількості стручків (O (1)). Кількість версій Xcode 6 теж краще обмежити :-)
Стівен Крамер

Додавання шляху до фреймворкових шляхів пошуку, здається, не вирізає його: тести будуватимуть, але не запускатимуться. Очевидно, через тестовий пакет не вдалося вирішити фреймворк XCTest.
Steven Kramer

0

Щодо проекту без Cocoapods (так що безпосередньо не відповідаючи на запитання ОП, але, можливо, корисний для мене чи інших в майбутньому), ми мали таку ж проблему. Це було вирішено заміною попередніх елементів OCTest на XCTest. Наприклад, файл MyApp.xcodeproj / project.pbxproj має цю різницю (скорочений); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.