Добавлена ​​цель модульного тестирования в Xcode - не удалось импортировать заголовок моста, не исчезнет

Я добавил новую цель Test в свой проект Xcode. В моем проекте есть код Swift и код Objective-C, а также заголовок моста. После добавления заголовка моста в настройки сборки UnitTesting или выполнения import MyTarget я получаю сообщение об ошибке:

не удалось импортировать заголовок моста

Я пробовал:

  • Добавление заголовка моста в настройки проекта, модульного тестирования и сборки основной цели.
  • Изменение defines modules на Yes.
  • Перемещение файла заголовка моста в корневую папку.

Я также пробовал создать образец проекта, который работал и работал нормально. Внести все, что у меня есть, в чистый новый проект - не вариант на данный момент.


person Andrew    schedule 05.02.2015    source источник
comment
Были ли у вас какие-то успехи в этом? У меня точно такая же проблема...   -  person Manuel M.    schedule 06.03.2015
comment
@ManuelM. добавить ${SDKROOT}/usr/include/libxml2 в пути поиска заголовков проекта. Сообщите мне, если это сработает для вас.   -  person Andrew    schedule 06.03.2015
comment
не сработало, боюсь ... :(   -  person Manuel M.    schedule 06.03.2015
comment
@ManuelM. Вы нашли решение?   -  person swalkner    schedule 15.10.2015
comment
@swalkner это было решено с дальнейшими версиями Xcode. В конце концов это сработало. Я действительно не знаю, что я сделал по-другому, извините. Думаю, я добавил несколько необходимых фреймворков в заголовок моста.   -  person Manuel M.    schedule 21.10.2015


Ответы (5)


Если вы используете CocoaPods в качестве диспетчера пакетов, необходимо указать путь поиска и т. Д. Дайте простой способ,

Попробуйте добавить это в свой подфайл:

target 'YourProductTests' do
    inherit! :search_paths
    # Pods for testing
end

и pod install

Меня устраивает.

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

  1. Щелкните свою тестовую цель -> Настройка сборки-> вкладка: Все и вместе -> Компилятор Swift - Генерация кода -> Заголовок моста Objective-C: добавьте заголовок xxx-bridging-header

  2. Отметьте «Путь поиска», установите значение Framework Search Path, Header Search Paths, Library Search Path в соответствии с вашей основной целью. Может здесь какой-то путь поиска потеряется, вручную добавить заново.

person Victor Choy    schedule 28.07.2016
comment
Второй вариант у меня сработал. Не использовал CocoaPods. - person Mark; 13.06.2019
comment
Это работает. это где-нибудь задокументировано? как я могу узнать больше о том, почему мы должны использовать inherit! : search_paths - person Awais Fayyaz; 26.02.2020

Решение @Victor Choy у меня работает, но мне пришлось переместить тестовую цель внутри товарной цели следующим образом:

target 'YourProduct' do

   # Pods for product

   target 'YourProductTests' do
      inherit! :search_paths
      # Pods for product testing
   end
end

У меня это не сработало:

target 'YourProduct' do
   # Pods for product
end

target 'YourProductTests' do
   inherit! :search_paths
   # Pods for product testing
end
person mkkrolik    schedule 07.02.2019
comment
Да. Ура решение сработало. Если вы знаете причину, пожалуйста, оставьте комментарий - person McDonal_11; 09.09.2020

На данный момент мне никогда не приходилось import MyTarget заставлять модульные тесты работать в Swift.

Общие решения

  • Я предполагаю, что вы пробовали это, но было непонятно, добавили ли вы свой заголовок моста в цель приложения и тестовую цель одновременно?
  • Другой вариант, который может быть не идеальным, - это добавить заголовок моста в вашу тестовую цель, чтобы у вас фактически было 2 заголовка моста. Они должны выглядеть одинаково и стать хорошим тестом.
  • Если для ссылки на ваш путь заголовка моста используется $(SRCROOT), убедитесь, что он оценивается как правильный путь.
  • Если ничего не помогает, вам следует выполнить сравнение файла вашего .xcodeproj с одним из вашего рабочего проекта и сопоставить все соответствующие значения, которые могут отличаться.

Система промежуточных заголовков не идеальна, но вот несколько проблем, с которыми я столкнулся.

person tfrank377    schedule 23.05.2015

Я столкнулся с той же проблемой. Я сделал следующее, и проблема «Не удалось импортировать заголовок моста» решена.

Шаги:

  1. Выберите свой проект -> Настройки сборки -> Найдите «Определяет модуль» -> дайте «ДА»
  2. Копировать путь к заголовку моста Objective-C
  3. Выберите тестовую цель -> Настройка сборки -> Компилятор Swift - Общие -> Заголовок моста Objective-C -> Укажите путь к заголовку Bridging.
  4. Убедитесь, что "Пути поиска заголовков" тестовых целей содержит все заголовки в ios Targets. Добавьте их, если какой-либо из заголовков отсутствует.
  5. Строить.

Ссылка: Перейдите по этой ссылке.

person Ssrini    schedule 24.05.2018
comment
К сожалению, эта ссылка устарела. - person ThomasW; 18.07.2020

Это может быть полезно для кого-то: если цель Unit Test добавлена ​​в существующий проект, который уже включает CocoaPods и некоторые модули библиотеки Objective-C.

Следующие шаги помогли решить проблему Не удалось импортировать заголовок моста.

  1. Выберите свой проект -> Настройки сборки -> Найдите «Определяет модуль» -> дайте «ДА»

  2. Скопируйте путь связующего заголовка Objective-C из целевого объекта YourProduct и вставьте его в путь связующего заголовка целевого объекта YourProductTests.

  3. Podfile должен иметь цель YourProductTests внутри YourProduct и включать _inherit! : search_paths_ как показано ниже

...

target 'YourProduct' do
   # Add Pods for your product here...

   target 'YourProductTests' do
      inherit! :search_paths
      # Pods for product testing, if any
   end
end
  1. Затем выполните команду pod install из корневой папки проекта. Это заполняет пути поиска заголовков для 'YourProductTests'.

  2. В качестве последнего шага убедитесь, что пути поиска заголовка цели YourProduct и YourProductTests должны быть похожими.

person Rishi    schedule 18.06.2020