Тестування блоку Xcode за допомогою какаоподів


119

Я останніми днями бив головою об стіну, але, незважаючи на багаторазові пошуки 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 все працює як шарм.
marosoaie

Я ще не пробував його, але міг би спробувати включити Firebase вручну, не використовуючи какао-стручки: firebase.google.com/docs/ios/setup#frameworks
Jonny

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

Дякую, але я просто спробував це, і у мене все ще є випуск "Клас ... реалізований в обох ...".
Дуоверс

1
Це працювало для мене, але це все ще не має для мене сенсу. Я не можу сказати, що Firebase дивно налаштовує свої підспекти, пор. twitter.com/dirtyhenry/status/836240557311684608, але команда Firebase не відповідає :(
Брудний Генрі

4
Внесення цієї зміни не одразу зняло попередження, але воно було вирішено після того, як я забіг pod install.
blwinters

Половина проблеми вирішена. та інша половина вирішується шляхом додавання "$ {PODS_ROOT} / Firebase / Core / Джерела" до вашої тестової цілі лише в розділі Налаштування збірки -> Шляхи пошуку заголовків
ArgaPK

Після внесення цієї зміни не забудьте запустити pod installдля оновлення залежностей проекту;)
jawad

57

Спробуйте змінити спадщину на :complete, як у:

target 'MyAppTests' do
    inherit! :complete
end

Що важливо, це дозволяє кожному, хто перевіряє ваше репо, просто робити pod updateяк завжди, не копіюючи .xcconfigфайли чи інший хакер, щоб створити його.


1
У цьому також є випуск "Клас ... реалізований в обох ..."
Diogo T

Це змусило помилку часу компіляції зникнути, але спричинило цю помилку під час виконання: clang: error: команда linker не вдалася з кодом виходу 1 (використання -v для перегляду виклику)
CMont

Працювали і для мене! Дякую :)
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)
Jonny


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 / Джерела

Крок 3: У термінальному виконанні:

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


7

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

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

Існує рішення:

Додайте "$ {PODS_ROOT} / Firebase / Core / Джерела" до своєї цілі тестів лише у розділі Налаштування збірки -> Шляхи пошуку заголовків

але це також виправлено шляхом оновлення до CocoaPods 1.4.0 або новішої версії, що є кращим рішенням.

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

gem install cocoapods --pre

Це, а потім pod installвирішити проблему, виконуючи мої тести.


1
що це "PODS_ROOT" ??
ArgaPK

@ArgaPK Це змінна, яку встановлюють cocoapods. Просто вставте саме те, що я написав між "" s в Xcode. Дійсно найкращий спосіб - оновити свої CocoaPods до> = 1.4.0.
ЙосифH

1
@JosephH оновлення моїх какаопів до 1.5.2, на жаль, не вирішило проблему.
Стейсі Сміт

@AnastasiaKovaleva ви запускалися pod installпісля оновлення?
ЙосифH

@JosephH Running 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", щоб переконатися, що проект 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 / Джерела

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

Після цього тести можуть запуститися і помилка зникне.


2

У мене була подібна проблема. Фразований з точки зору вашого запитання, я скопіював вміст свого MyApp.<configuration>.xcconfigфайлу у свій MyAppTests.<configuration>.xcconfigфайл. Я прибирав і будував тести, і це спрацювало.


Це було єдине рішення, яке працювало на мене. Дякую! Я думаю про те, чи робити обробку після установки в Podfile, роблячи це
SauloT

1

Додайте "$ {PODS_ROOT} / Firebase / Core / Джерела" до своєї цілі тестів лише в розділі Налаштування збірки -> Шляхи пошуку заголовка


Що це ? PODS_ROOT
ArgaPK

він знайде каталог для pod
Karthick Vadivel

1

Як @Will згадав про проблему навколо шляхів пошуку заголовків після встановлення CocoaPods.

У мене є проект з декількома цілями, де поділ Firebase вбудований в окремий модуль, скажімо MyProject-Shared. Firebase pod на "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:

Якщо ви використовуєте 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.