Подтвердить что ты не робот

Тестирование блока Xcode с помощью Cocoapods

Я уже несколько дней стучаю головой о стену, но, несмотря на несколько поисков Google/SO/Github, я не могу найти решение проблем, которые у меня есть.

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

Я использую Xcode 7.3.1 и Cocoapods 1.0.1. Обновление: Проблема остается с Xcode 8.0

С этим podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
    end
end

В моем классе XCTest я получаю

Отсутствует необходимый модуль "Firebase"

ошибка при @testable import MyApp

В качестве альтернативы с этим podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

def common_pods
    pod 'SwiftyTimer'
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'
end

target 'MyApp' do
    common_pods
end

target 'MyAppTests' do
    common_pods
end

Тесты строятся, но моя консоль усеяна предупреждениями, например:

Класс < -FirebaseClassName- > реализуется как в... MyApp... и... MyAppTests... Один из двух будет использоваться. Какой из них undefined

4b9b3361

Ответ 1

Решением для меня было обновление cocoapods до версии 1.1.0.rc.2.

sudo gem install cocoapods --pre

Ответ 2

У меня была такая же проблема. Я решил это, переместив pod 'Firebase' в свою тестовую цель. Измените свой подфайл:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
        pod 'Firebase'
    end
end

Ответ 3

Попробуйте изменить наследование на :complete, как в:

target 'MyAppTests' do
    inherit! :complete
end

Важно, чтобы кто-то еще проверил ваше репо, просто выполнив pod update, как обычно, без необходимости копировать файлы .xcconfig или другие хакеры только для сборки.

Ответ 4

  1. Выберите настройку целевого объекта.
  2. Перейдите в раздел "Настройки сборки".
  3. Найдите пути поиска заголовков.
  4. Добавьте это значение $ (SRCROOT)/Pods с рекурсивным, тогда Xcode решит путь для вас.

пример

Ответ 5

Проблема заключается в том, что Firebase делает что-то особенное с путями поиска заголовков после того, как CocoaPods генерирует собственное значение для параметра, поэтому CocoaPods не подбирает это изменение, чтобы переносить его на тестовый объект. Вы можете решить этот один из двух способов:

  • Найдите MyAppTests.<configuration>.xcconfig в навигаторе файлов и добавьте следующее в HEADER_SEARCH_PATHS:

    ${PODS_ROOT}/Firebase/Analytics/Sources [*]

  • Найдите настройки для Пути поиска заголовков в настройках сборки и добавьте то же значение, что и в опции 1 к списку. Вам не нужно устанавливать его как рекурсивный.

* В соответствии с комментарием AKM это изменилось на ${PODS_ROOT}/Firebase/Core/Sources в версии 3.14.0

Ответ 6

Проблема записана в проекте firebase здесь:

https://github.com/firebase/firebase-ios-sdk/issues/58

Существует обходное решение:

Добавьте "$ {PODS_ROOT}/Firebase/Core/Sources" в целевую аудиторию только в настройках сборки → Пути поиска заголовков

но это также исправлено путем обновления до CocoaPods 1.4.0 или более поздней версии, что является лучшим решением.

В то время, когда я пишу это (ноябрь 2017 года), cocoapods 1.4.0 все еще находится в стадии бета-тестирования, поэтому для его установки вам необходимо явно запросить бета-версию:

gem install cocoapods --pre

Это, а затем выполнение pod install решило проблему с запуском моих тестов.

Ответ 7

Три шага, прежде чем я смогу заставить это работать:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Шаг 1. Обязательно добавьте следующий целевой блок в ваш файл.

# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'

target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'

    target 'TIMIITests' do
        inherit! :search_paths
        pod 'Firebase/Core'
    end

end

Шаг 2: На вкладке "Настроить вкладку" Настроить проект "на вкладке" Навигатор проекта ". Найдите строку пути поиска заголовка и добавьте в Debug следующую строку

$ (унаследованный) $ {PODS_ROOT}/Firebase/Core/Sources

Шаг 3: В терминальном запуске:

обновление pod

Ответ 8

Я попробовал все вышеперечисленное и столкнулся с различными ошибками, первоначально начиная с Missing required module 'Firebase', затем получая "Class ... is implemented in both ... " или проблемы с компоновщиком, если я пытался добавить модули Firebase в свою цель тестирования.

Решение, которое сработало для меня, заключалось в следующем:

  1. Полностью удалите цель тестирования из Podfile и запустите "pod update", чтобы убедиться, что проект XCode синхронизирован.
  2. Откройте мою тестовую цель Настройки сборки и обновите пути поиска заголовка, чтобы включить только следующие 3 элемента:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

На этом этапе очистка папки сборки, повторная сборка и повторный запуск тестов помогли мне. Надеюсь, это поможет кому-то!

Ответ 9

У меня была аналогичная проблема. Ссылаясь на ваш вопрос, я скопировал содержимое моего файла MyApp.<configuration>.xcconfig в мой файл MyAppTests.<configuration>.xcconfig. Я очистил и построил тесты, и это сработало.

Ответ 10

Добавить "$ {PODS_ROOT}/Firebase/Core/Sources" в целевую аудиторию только в Настройки сборки Контуры поиска заголовков

Ответ 11

Как @Вы упомянули проблему вокруг путей поиска заголовков после установки CocoaPods.

У меня есть проект с несколькими целями, где pod "Firebase" встроен в отдельный модуль, скажем, MyProject-Shared. Firebase pod в 'Podfile' установлен только для цели MyProject-Shared. Другие модули, которые хотят использовать "MyProject-Shared", не могут быть скомпилированы из-за ошибки:

"отсутствует требуемый модуль" Firebase "'

Трюк в моем случае состоял в том, чтобы добавить следующий отсутствующий путь поиска заголовка в каждой целевой настройке Build Settings, ссылаясь на Google Analytics-Framework:

"${PODS_ROOT}/Firebase/CoreOnly/Sources"

См. Рис. Ниже: Header Search Path

Надеюсь, это сэкономит ваше время.

Ответ 12

Добавление ${SRCROOT}/Pods/Firebase/CoreOnly/Sources в цель модульного теста "Пути поиска заголовка" устранило проблему. Этапы:

  1. Выберите цель модульных тестов
  2. Перейдите в Настройки сборки
  3. Поиск пути поиска заголовка
  4. Добавьте $ {SRCROOT}/Pods/Firebase/CoreOnly/Sources

enter image description here

После этого тесты могут быть запущены, и ошибка исчезнет.

Ответ 13

Missing required module Firebase НЕТ раствора CocoaPods

Для тех, кто сталкивается с той же проблемой, но НЕ использует CocoaPods:

Если вы используете Firebase, у вас есть папка, содержащая файлы Firebase.h и module.modulemap. Например - YOUR_PROJECT_DIR/Linking

Если цель вашего основного проекта работает правильно, то вам следует перейти к ProjectSettings → Targets. Выберите цель теста. Найдите User headers и добавьте путь к YOUR_PROJECT_DIR/Linking. Выберите опцию recursive и вам будет хорошо идти.

Смотрите скриншот для более подробной информации:

enter image description here