Test unitaire Xcode avec Cocoapods

120

Je me suis cogné la tête contre un mur avec cela ces derniers jours, mais malgré de multiples recherches Google / SO / Github, je ne trouve pas de solution aux problèmes que je rencontre!

Tout ce que j'essaie de faire est de créer des tests unitaires pour mon application qui utilise des pods Firebase.

J'utilise Xcode 7.3.1 et Cocoapods 1.0.1. Mettre à jour: problème persiste avec Xcode 8.0

Avec ce 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

Dans ma classe XCTest, je reçois

Module requis 'Firebase' manquant

erreur à @testable import MyApp

Alternativement avec ce 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

Les tests se construisent mais ma console est jonchée d'avertissements, par exemple:

La classe <-FirebaseClassName-> est implémentée dans les deux ... MyApp ... et ... MyAppTests ... Un des deux sera utilisé. Lequel n'est pas défini

doovers
la source
J'utilisais uniquement Firebase Analytics. Après le passage à Google Analytics, tout fonctionne comme un charme.
marosoaie
Je n'ai pas encore essayé le sien moi-même, mais je pourrais essayer d'inclure Firebase manuellement sans utiliser de cabosses de cacao: firebase.google.com/docs/ios/setup#frameworks
Jonny
1
C'est toujours un problème
Edward

Réponses:

84

J'ai eu le même problème. Je l'ai résolu en passant pod 'Firebase'à ma cible de test. Changez votre Podfile comme suit:

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
Mackarous
la source
Merci, mais je viens d'essayer et j'ai toujours le problème "La classe ... est implémentée dans les deux ...".
doovers
1
Cela a fonctionné pour moi, mais cela n'a toujours pas de sens pour moi. Ce n'est pas la première fois que je peux dire que Firebase configure bizarrement ses podspecs, cf. twitter.com/dirtyhenry/status/836240557311684608 mais l'équipe Firebase ne répond pas :(
Dirty Henry
4
Cette modification n'a pas effacé immédiatement l'avertissement, mais il a été résolu après ma course pod install.
blwinters le
La moitié du problème est résolu. et l'autre moitié est résolue en ajoutant "$ {PODS_ROOT} / Firebase / Core / Sources" à votre cible de tests uniquement sous Paramètres de construction -> Chemins de recherche d'en-tête
ArgaPK
Après avoir apporté cette modification, n'oubliez pas de lancer pod installpour mettre à jour les dépendances du projet;)
jawad
57

Essayez de changer l'héritage en :complete, comme dans:

target 'MyAppTests' do
    inherit! :complete
end

Surtout, cela permet à toute autre personne qui vérifie votre dépôt de faire pod updatecomme d'habitude sans avoir à copier des .xcconfigfichiers ou autre piratage juste pour construire.

Andy Chou
la source
1
Cela a également le problème "La classe ... est implémentée dans les deux ..."
Diogo T
Cela a fait disparaître l'erreur de compilation, mais a causé celle-ci au moment de l'exécution: clang: erreur: la commande de l'éditeur de liens a échoué avec le code de sortie 1 (utilisez -v pour voir l'invocation)
CMont
A travaillé pour moi aussi! Merci :)
smapps
52
  1. Sélectionnez votre paramètre de cible de test unitaire.
  2. Accédez aux paramètres de construction.
  3. Recherchez les chemins de recherche d'en-tête.
  4. Ajoutez cette valeur $ (SRCROOT) / Pods avec récursif, puis Xcode résoudra le chemin pour vous.

Exemple

Kanika Sharma
la source
1
Merci @Kanika Sharma
Rahul K Rajan
34

Le problème est que Firebase fait quelque chose de spécial avec les chemins de recherche d'en-tête après que CocoaPods ait généré sa propre valeur pour le paramètre afin que CocoaPods ne prenne pas en compte ce changement afin de le reporter à la cible de test. Vous pouvez résoudre ce problème de deux manières:

  1. Recherchez MyAppTests.<configuration>.xcconfigdans le navigateur de fichiers et ajoutez ce qui suit à HEADER_SEARCH_PATHS:

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

  2. Recherchez le paramètre pour les chemins de recherche d'en-tête dans les paramètres de construction et ajoutez la même valeur que dans l'option 1 à la liste. Vous ne devriez pas avoir besoin de le définir comme récursif.

* Selon le commentaire d'AKM, cela a changé ${PODS_ROOT}/Firebase/Core/Sourcesen version 3.14.0

Volonté
la source
J'ai essayé mais toujours les mêmes avertissements
Doovers
8
À partir de Firebase 3.14.0 Cette solution est valide, mais le correctif est devenu${PODS_ROOT}/Firebase/Core/Sources
AKM
1
Un nouveau chemin a fonctionné pour moi aussi! J'exécute CocoaPods version 1.2.0 , mais gardez à l'esprit que j'ai également dû ajouter inherit! :search_pathsà la cible de test dans le Podfile.
Paulo Mattos
2. ne fonctionne pas pour moi. Utilisation de Firebase 3.x (pas le plus récent 4.x)
Jonny
Le problème peut être suivi ici: github.com/firebase/firebase-ios-sdk/issues/58
CMont
7

Trois étapes avant que je puisse faire fonctionner cela:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Étape 1: assurez-vous d'ajouter le bloc cible suivant dans votre fichier pod.

# 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

Étape 2: Dans l'onglet Paramètres de construction du navigateur de projet YourAppTests. Recherchez la ligne du chemin de recherche d'en-tête et ajoutez au débogage la ligne suivante

$ (hérité) $ {PODS_ROOT} / Firebase / Core / Sources

Étape 3: Dans l'exécution du terminal:

mise à jour du pod

Sid
la source
7

Le problème est enregistré dans le projet Firebase ici:

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

Il existe une solution de contournement:

Ajoutez "$ {PODS_ROOT} / Firebase / Core / Sources" à votre cible de tests uniquement sous Paramètres de construction -> Chemins de recherche d'en-tête

mais cela est également résolu par la mise à niveau vers CocoaPods 1.4.0 ou version ultérieure, ce qui est une meilleure solution.

Au moment où j'écris ceci (novembre 2017), cocoapods 1.4.0 est toujours en version bêta, donc pour l'installer, vous devez demander explicitement la version bêta:

gem install cocoapods --pre

Ceci et ensuite faire un a pod installrésolu le problème en exécutant mes tests.

JosephH
la source
1
qu'est-ce que c'est "PODS_ROOT" ??
ArgaPK
@ArgaPK C'est une variable définie par les cocoapodes. Collez exactement ce que j'ai écrit entre les "" dans Xcode. Le meilleur moyen est de mettre à niveau vos CocoaPods vers> = 1.4.0.
JosephH
1
@JosephH a mis à jour mes cocoapodes vers la version 1.5.2 n'a malheureusement pas résolu le problème.
Stacy Smith
@AnastasiaKovaleva avez-vous exécuté pod installaprès la mise à niveau?
JosephH
@JosephH Running a pod installrésolu mon problème! Merci beaucoup!
Stacy Smith
4

La solution pour moi était de mettre à jour les cocoapodes vers la version 1.1.0.rc.2.

sudo gem install cocoapods --pre

doovers
la source
Malheureusement, cela ne fonctionne pas pour moi ... Je dois reprendre mon vote favorable!
Zeb
Désolé, cela ne vous a pas aidé les gars, je ne sais pas pourquoi cela a résolu le problème pour moi et pas pour vous ...
Doovers
Je suis sur 1.20 et pas de chance
UKDataGeek
4

J'ai essayé tout ce qui précède et j'ai rencontré diverses erreurs, commençant à l'origine par Missing required module 'Firebase', puis obtenant"Class ... is implemented in both ... " problèmes d' ou de liaison si j'essayais d'ajouter des pods Firebase à ma cible de test.

La solution qui a fonctionné pour moi était de:

  1. Supprimez entièrement la cible de test de Podfile et exécutez 'pod update' pour vous assurer que le projet XCode est synchronisé.
  2. Ouvrez les paramètres de construction de ma cible de test et mettez à jour les chemins de recherche d'en-tête pour n'inclure que les 3 éléments suivants:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

À ce stade, nettoyer le dossier de construction, reconstruire puis réexécuter les tests a fonctionné pour moi. J'espère que cela aide quelqu'un!

Mike Atkins-Orthographe
la source
Après avoir essayé tout le reste sur ce fil - c'était la seule réponse qui a fait fonctionner les choses pour moi. Je vous remercie!
Ali Parr
4

L'ajout ${SRCROOT}/Pods/Firebase/CoreOnly/Sourcesaux "chemins de recherche d'en-tête" de la cible de test unitaire a résolu le problème. Pas:

  1. Sélectionnez votre cible de tests unitaires
  2. Accédez aux paramètres de construction
  3. Rechercher le chemin de recherche d'en-tête
  4. Ajouter $ {SRCROOT} / Pods / Firebase / CoreOnly / Sources

entrez la description de l'image ici

Après cela, les tests peuvent s'exécuter et l'erreur disparaîtra.

User123335511231
la source
2

J'avais un problème similaire. Formulé en fonction de votre question, j'ai copié le contenu de mon MyApp.<configuration>.xcconfigfichier dans mon MyAppTests.<configuration>.xcconfigfichier. J'ai nettoyé et construit les tests, et cela a fonctionné.

Jason
la source
C'était la seule solution qui fonctionnait pour moi. Merci! Je pense faire un traitement post-installation dans le Podfile en le faisant
SauloT
1

Ajoutez "$ {PODS_ROOT} / Firebase / Core / Sources" à votre cible de tests uniquement sous Paramètres de construction -> Chemins de recherche d'en-tête

Karthick Vadivel
la source
Qu'Est-ce que c'est ? PODS_ROOT
ArgaPK
il récupérera le répertoire pour le pod
Karthick Vadivel
1

Comme @Will a mentionné un problème concernant les chemins de recherche d'en-tête concernant les après l'installation de CocoaPods.

J'ai un projet avec plusieurs cibles où le pod 'Firebase' est intégré dans un module séparé, disons MyProject-Shared . Le pod Firebase sur «Podfile» est installé uniquement pour la cible «MyProject-Shared». Les autres modules qui souhaitent utiliser 'MyProject-Shared' ne peuvent pas être compilés en raison d'une erreur:

'module requis "Firebase" manquant'

L'astuce dans mon cas était d'ajouter le chemin de recherche d'en-tête manquant suivant aux paramètres de construction de chaque cible faisant référence à Analytics-Framework :

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

Veuillez voir la photo ci-dessous: Chemin de recherche d'en-tête

J'espère que cela vous fera gagner du temps.

Stanislau Baranouski
la source
1

Une méthode plus simple qui fonctionne également:

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

    target :MyAppTests
end
Daniel
la source
0

Missing required module Firebase PAS de solution CocoaPods

Pour ceux qui rencontrent le même problème mais n'utilisent PAS CocoaPods:

Si vous utilisez Firebase, vous avez un dossier contenant Firebase.het module.modulemapfichier. Par exemple -YOUR_PROJECT_DIR/Linking

Si la cible de votre projet principal fonctionne correctement, vous devez aller dans ProjectSettings -> Targets. Sélectionnez la cible de test. Recherchez User headerset ajoutez le chemin d'accès YOUR_PROJECT_DIR/Linking. Sélectionnez l' recursiveoption et vous devriez être prêt à partir.

Voir la capture d'écran pour plus de détails:

entrez la description de l'image ici

quelques lignes de code
la source