Модульное тестирование Xcode с помощью Cocoapods


121

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

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

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

С помощью этого подфайла:

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

В качестве альтернативы с помощью этого подфайла:

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 ... Будет использоваться один из двух. Какой из них не определен


Я использовал только Firebase Analytics. После перехода на Google Analytics все работает как шарм.
marosoaie

Я еще не пробовал его сам, но могу попытаться включить Firebase вручную, не используя стручки какао: firebase.google.com/docs/ios/setup#frameworks
Джонни,

1
Это все еще проблема
Эдвард

Ответы:


84

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

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

Спасибо, но я только что попробовал, и у меня все еще есть проблема «Класс ... реализован в обоих ...».
doovers 07

1
Это сработало для меня, но все еще не имеет смысла. Это не первый раз, когда я могу сказать, что Firebase странным образом настраивает свои podspec, ср. twitter.com/dirtyhenry/status/836240557311684608, но команда Firebase не отвечает :(
Dirty Henry

4
Внесение этого изменения не сразу сняло предупреждение, но оно было устранено после того, как я запустил pod install.
blwinters

Половина проблемы решена. а другая половина решается путем добавления "$ {PODS_ROOT} / Firebase / Core / Sources" к цели
тестирования

После внесения этого изменения не забудьте запустить pod install, чтобы обновить зависимости проекта;)
jawad

57

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

target 'MyAppTests' do
    inherit! :complete
end

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


1
У этого также есть проблема «Класс ... реализован в обоих ...»
Diogo T

Это заставило ошибку времени компиляции исчезнуть, но вызвало эту ошибку во время выполнения: clang: error: команда компоновщика
завершилась

У меня тоже сработало! Спасибо :)
smapps

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

пример


1
Спасибо @Kanika Sharma
Rahul K Rajan

34

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

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

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

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

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


Пытался, но все равно получаю те же предупреждения
doovers

8
Начиная с Firebase 3.14.0. Это решение действительно, однако патч изменен на${PODS_ROOT}/Firebase/Core/Sources
AKM

1
Новый путь мне тоже подошел! Я использую CocoaPods версии 1.2.0 , но имейте в виду, что мне также пришлось добавить inherit! :search_pathsв тестовую цель в Podfile.
Пауло Маттос

2. у меня не работает. Использование Firebase 3.x (не новейшего 4.x)
Джонни,


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. На вкладке "Параметры сборки" Навигатора проекта YourAppTests. Найдите строку «Путь поиска заголовка» и добавьте в «Отладку» следующую строку

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

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

обновление стручка


7

Проблема записана в проекте 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решение проблемы с запуском моих тестов.


1
что это "PODS_ROOT" ??
ArgaPK

@ArgaPK Это переменная, которую устанавливает cocoapods. Просто вставьте в Xcode именно то, что я написал между "". На самом деле лучший способ - обновить ваши CocoaPods до> = 1.4.0.
JosephH

1
@JosephH, обновивший мои cocoapods до 1.5.2, к сожалению, не решил проблему.
Стейси Смит

@AnastasiaKovaleva запустилась pod installпосле обновления?
JosephH

@JosephH Бег pod installрешил мою проблему! Большое спасибо!
Стейси Смит

4

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

sudo gem install cocoapods --pre


К сожалению, у меня это не работает ... Я должен забрать свой голос!
Зеб

Извините, это не помогло вам, ребята, не знаю, почему это решило проблему для меня, а не для вас ...
doovers

Я на 1.20, и мне не повезло
UKDataGeek

4

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

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

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

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


После того, как я попробовал все остальное в этой теме, это был единственный ответ, который помог мне. Спасибо!
Али Парр

4

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

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

введите описание изображения здесь

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


2

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


Это было единственное решение, которое сработало для меня. Спасибо! Я подумываю о том, чтобы сделать это в Podfile после установки
SauloT


1

Поскольку @Will упомянул проблему с путями поиска заголовков после установки CocoaPods.

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

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

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

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

См. Рис. Ниже: Путь поиска заголовка

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


1

Более простой способ, который тоже работает:

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

    target :MyAppTests
end

0

Missing required module Firebase БЕЗ решения CocoaPods

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

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

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

Подробности смотрите на скриншоте:

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.