web-dev-qa-db-fra.com

Test d'unité Xcode avec des cocoapodes

Cela fait quelques jours que je me frappe la tête contre un mur, mais malgré plusieurs 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 utilisent les pods Firebase.

J'utilise Xcode 7.3.1 et Cocoapods 1.0.1. Mise à jour: Le problème reste 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 manquant 'Firebase'

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 à la fois dans ... MyApp ... et ... MyAppTests ... L'un des deux sera utilisé. Lequel n'est pas défini

86
doovers

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

Sudo gem install cocoapods --pre

3
doovers

J'ai eu le même problème. Je l'ai résolu en déplaçant pod 'Firebase' vers ma cible de test. Changez votre Podfile en ceci:

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
65
Mackarous

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

target 'MyAppTests' do
    inherit! :complete
end

Il est important de noter que cela permet à tous ceux qui consultent votre dépôt de faire simplement un pod update comme d'habitude sans avoir à copier des fichiers .xcconfig ou un autre hackery juste pour construire.

43
Andy Chou

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 génère sa propre valeur pour le paramètre afin que CocoaPods ne détecte pas cette modification afin de la reporter sur la cible de test. Vous pouvez résoudre ce problème de deux manières:

  1. Localisez MyAppTests.<configuration>.xcconfig dans le navigateur de fichiers et ajoutez ce qui suit à HEADER_SEARCH_PATHS:

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

  2. Recherchez le paramètre 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 de AKM, ceci a été remplacé par ${PODS_ROOT}/Firebase/Core/Sources dans la version 3.14.0

32
Will
  1. Sélectionnez votre paramètre de cible de test unitaire.
  2. Allez dans les 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

22
Kanika Sharma

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

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

Il y a 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 corrigé par la mise à niveau vers CocoaPods 1.4.0 ou une version ultérieure, ce qui constitue une meilleure solution.

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

gem install cocoapods --pre

Ceci, puis un pod install ont résolu le problème de l'exécution de mes tests.

6
JosephH

Trois étapes avant que je puisse obtenir que cela fonctionne:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Étape 1: Assurez-vous d’ajouter le bloc cible suivant dans votre podfile.

# 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 de YourAppTests Project Navigator. Recherchez la ligne du chemin de recherche d'en-tête et ajoutez-la à Debug la ligne suivante

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

Étape 3: En terminal: 

pod update

4
Dennis

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

2
Jason

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

1
Karthick Vadivel

L'ajout de ${SRCROOT}/Pods/Firebase/CoreOnly/Sources dans les "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. Aller à Configurer les paramètres
  3. Recherche de chemin de recherche en-tête
  4. Ajouter $ {SRCROOT}/Pods/Firebase/CoreOnly/Sources

enter image description here

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

0
User123335511231