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 больше не находится в списке фазы сборки «Link Libraries with Binaries», но это нормально, потому что когда я создаю новый проект с Xcode 6, кажется, что библиотека подключается автоматически.

Возможно, из-за некоторой актуальности все мои зависимости, требующие XCTest, вводятся через Cocoapods.

Есть ли что-то, о чем я не знаю, что мне нужно обновить в моем проекте?

Эрик Кербер
источник

Ответы:

142

Примечание: это может не потребоваться для любых проектов, созданных в Xcode 7.

У CocoaPods есть исправление для этого здесь и здесь


Чтобы исправить это для любых зависимостей CocoaPod, вам необходимо добавить следующее FRAMEWORK_SEARCH_PATHSв любую цель Pod, которая требует XCTest (например, Kiwi, Specta, FBSnapshotTestCase и т. Д.).

$(PLATFORM_DIR)/Developer/Library/Frameworks

Скриншот

Это позволит вам ссылаться на XCTest во всех возможных зависимостях. Это может быть исправлено в будущем обновлении CocoaPods или модуля, на который вы ссылаетесь, поэтому вы можете удалить его позже.

Это не наносит вреда более ранним версиям Xcode, поэтому использовать его следует безопасно.

квадратная лягушка
источник
Спасибо, SquareFrog. Соответствующий выпуск здесь
fatuhoku
1
Когда запланирован следующий выпуск?
fatuhoku
6
Кажется, это не работает с KIM в xcode 6 GM ..?
Thomas Clowes
3
Я не согласен с «не имеет отношения к Xcode 7». У меня была проблема в Xcode 7.1. Проблема исчезла после того, как я добавил этот путь поиска фреймворка, как указано выше. Я предполагаю, что проект, запущенный в Xcode 7, не будет иметь проблемы, но вопрос здесь в том, чтобы создавать старые проекты в новых Xcodes.
Джерри Кринок
1
начиная с XCode 9 вы должны установить параметр сборки
FRAMEWORK_SEARCH_PATHS
40

Я перемещал файлы в проекте. Все, что вам нужно сделать, это выбрать ваши тестовые файлы xxxTests.mи т. Д. И file inspectorвыбрать targetкак, testа не как обычную цель.

Якуб Трухларж
источник
1
Именно то, что случилось со мной. Я не заметил, что когда я его переместил, цель для файла «изменилась». Я должен был подумать об этом, исходя из того, как он был перемещен (удалить в Xcode и снова добавить). Благодарю.
chadbag
1
простой ответ, который сработал для меня. Были проблемы, когда я переименовал свои файлы, и это было решение в моем случае.
Саймон
17

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

Мустафа
источник
Вот и все. Cocoapods создает проекты / цели статических библиотек. Хорошая находка!
Эрик Кербер
1
Скорее всего, вам потребуется переместить весь код, связанный с XCTest, в тестовую цель.
Мустафа
Это сложно, если вы используете CocoaPods для включения Kiwi или Specta в свой проект.
squarefrog 09
2
Итак ... что исправить?
fatuhoku
12

Эта ошибка возникает, когда вы добавляете файл, в котором XCTest используется вне тестовой цели. Чтобы исправить это в AppCode, вы можете щелкнуть правой кнопкой мыши любой подозрительный файл и выбрать «Управление целями», а затем убедиться, что отмечена только тестовая цель.

Таш Пемхива
источник
Я сталкивался с этой проблемой не раз.
pshah
Это случилось со мной после перемещения файлов в проекте и повторного добавления их в неправильную цель.
Джайлз
11

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

Если вы добавите это в свой подфайл, он автоматически добавит дополнительный путь для вас. Например , если вы хотите добавить $(PLATFORM_DIR)/Developer/Library/Frameworksк FRAMEWORK_SEARCH_PATHSдля Specta:

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
DeanWombourne
источник
Обратите внимание, что вам может потребоваться изменить "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 (описанный в руководстве), чтобы отличить его от версии модулей с установленным гемом.

Преимущество этого подхода заключается в том, что вам не нужны дополнительные сценарии в вашем Podfile. Вам просто нужно не забыть сделать pod-dev installвместо обычного pod install.

фатухоку
источник
1

Лучший способ получить XCTest - это добавить его из Test Navigator (5-й значок на левой панели).

Действуя таким образом, новый xx.mтестовый файл нацелен не на (в правой панели) приложение (на левой панели> Target, Wrapper Extension: app), а на пакет (Wrapper Extension: xctest)

  • XCTest.framework остается красным,
  • из-за некоторых модификаций вы можете получить ошибку 'XCTest/XCTest.h' file not found, потому что ваш файл должен быть нацелен на приложение.
tontonCD
источник
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.
Стивен Крамер
0

В проекте без Cocoapods (так что не отвечая напрямую на вопрос OP, но, возможно, полезно для меня или других в будущем), у нас была такая же проблема. Это было решено заменой наших предыдущих пунктов OCTest на XCTest. Например, файл MyApp.xcodeproj / project.pbxproj имеет это различие (сокращенно); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

AnneTheAgile
источник