J'essaie d'écrire des tests de logique iOS sur des classes de mon projet qui utilisent des fonctionnalités de certaines des bibliothèques de mon podspec. J'utilise le bundle de tests unitaires standard fourni dans Xcode (mais pas les tests d'application, juste les tests unitaires).
Par exemple, j'utilise Magical Record, et j'ai cette bibliothèque liée dans mon podspec. Il est présent dans le projet Pods de mon espace de travail et fonctionne comme prévu lorsque l'application s'exécute dans le simulateur ou sur l'appareil. Lorsque j'essaie de lier au test l'objet qui utilise Magical Record, cependant, j'obtiens une erreur de l'éditeur de liens indiquant qu'il ne peut pas trouver les sélecteurs de Magical Record. J'ai essayé de mettre à jour mon HEADER_SEARCH_PATH dans mon bundle de test logique, même en le codant en dur dans le répertoire d'en-têtes créé par CocoaPods, mais pas de chance.
Je peux exécuter des tests unitaires sur des classes qui n'utilisent pas les bibliothèques CocoaPods sans problème.
Est-ce que je me trompe? Dois-je faire autre chose pour que le compilateur voie les bibliothèques CocoaPods?
la source
isSubclassOfClass:
appels retournentNO
là où ils devraient revenirYES
. La seule raison pour laquelle je peux expliquer cela est que les dépendances sont vraiment liées à la fois à la cible principale et à la cible de test, et lorsque le chargeur de bundle de la cible de test charge le bundle principal, il ne peut pas décider quelle classe prendre.isKindOfClass:
retourNO
quand il devrait revenirYES
. Si je connecte le pointeur vers leClass
de mon objet que je teste et leClass
de la classe que je veux comparer, ce sont deux valeurs différentes. Il est clair que mon code du bundle d'applications utilise un symbole différent pour la classe que le code de mes tests unitaires. Quelqu'un a-t-il trouvé un moyen de résoudre ce problème?J'ai compris celui-ci en regardant comment la cible principale de mon application recevait les paramètres de la bibliothèque CocoaPods. CocoaPods inclut un fichier .xcconfig nommé Pods.xcconfig. Ce fichier contient tous les chemins de recherche d'en-tête.
Si vous regardez votre projet dans le navigateur de projet et cliquez sur l'onglet Info, vous verrez vos configurations de construction répertoriées dans la section supérieure. Si vous ouvrez le triangle de divulgation pour vos différentes configurations, vous verrez des pods répertoriés sous votre cible principale. J'ai dû cliquer sur le menu déroulant et ajouter des pods à la cible de test logique.
J'ai également dû copier les paramètres de
$(inherited)
et${PODS_HEADERS_SEARCH_PATHS}
de ma cible principale et les copier dans la cible de test logique sous Build Settings / HEADER_SEARCH_PATHS.Enfin, j'ai dû ajouter libPods.a dans la phase de construction Link Binary with Libraries pour ma cible de tests logiques.
J'espère que cela pourra aider quelqu'un d'autre.
la source
Il existe une solution que j'ai trouvée ici Tests unitaires avec CocoaPods :
Ouvrez le fichier de projet dans Xcode, puis choisissez le projet (pas la cible), dans le panneau de droite, il y a une section appelée Configurations. Choisissez Pods dans la colonne "Basé sur le fichier de configuration" pour votre cible de test.
la source
Specta
celle que vous souhaitez lier avec le projet de test mais pas avec le projet principal? : SClass Foo is implemented in both MyApp and MyAppTestCase. One of the two will be used. Which one is undefined.
Cela semble être dû à un bogue dans Cocoapods; voir la réponse @JRV ci-dessous.Je suis d'accord avec les autres réponses disant qu'il est nécessaire de relier les bibliothèques aux cibles de test. Cependant, aucune des suggestions jusqu'à présent ne m'a aidé. Comme @fabb l'écrit dans un commentaire: "lors du test, les
isSubclassOfClass:
appels retournent NON là où ils devraient renvoyer OUI. La seule raison pour laquelle je peux expliquer cela est que les dépendances sont vraiment liées à la fois à la cible principale et à la cible de test, et lorsque le bundle de la cible de test loader charge le bundle principal, il ne peut pas décider quelle classe prendre. " J'obtiens le même problème avec toutes les suggestions précédentes dans ce fil.La solution que j'ai mise au travail a été de mettre à jour mon Podfile pour définir des pods spécifiques pour ma cible principale et ma cible de test:
Il était nécessaire de spécifier un pod pour ma cible de test même si je n'ai utilisé aucun pod spécifique au test. Sinon, CocoaPods n'insérerait pas la logique de liaison nécessaire dans mon projet.
Ce lien est ce qui m'a aidé à arriver à cette conclusion.
la source
J'ai ajouté
:exclusive => true
pour éviter les erreurs de symboles dupliqués dans la cible de test d'application.Lorsque j'ai remplacé la cible de test d'application par celle de test d'unité logique, l'erreur de l'éditeur de liens se produit. Après avoir supprimé
:exclusive => true
, tout fonctionne à nouveau.:exclusive => true
indique que tout ce qui se trouve à l'extérieurdo...end
ne doit PAS être liémyProjectTests
, ce qui est raisonnable dans les cibles de test d'application, mais cela provoquera des erreurs de l'éditeur de liens dans les cibles de test logiques.la source
Vous pouvez utiliser link_with selon la solution @Keith Smiley.
Si vous avez des pods communs et des spécificités pour chaque cible, vous pouvez utiliser l'option "def" pour définir un groupe de pods. et utilisez le "def" plus tard dans la cible exclusive.
dans l'exemple ci-dessus, j'ai ajouté 'SSKeychain' aux deux cibles et 'Typhoon' uniquement à la cible 'MyProject'
la source
Ma solution à ce problème était de changer mon Podfile pour inclure la bibliothèque dans les deux cibles comme celle-ci
Et comme j'utilise swift, j'ai également dû configurer la cible de test pour inclure le
MyApp-Bridging-Header.h
fichier. (Dans le groupe Swift Compiler sous l'onglet Build Settings)la source
Pods
projet. En mentionnant vos pods deux fois (une fois pour les tests et une fois pour l'application), vous aurez deux ensembles de cibles. Cela double efficacement le travail de configurationpod install
à effectuer. Ce ne sera pas un problème tant que vous n'aurez pas plus de 15 pods, alors ne vous inquiétez pas trop d'ici là.J'ai eu un événement similaire lorsque j'ai perdu des fichiers de bibliothèque lors d'un contrôle de version. J'ai toujours vu le fichier de bibliothèque dans mes pods mais avec le code réel manquant, XCode a dit qu'il avait disparu. À ma grande consternation, exécuter 'pod install' ne ramena pas immédiatement les fichiers perdus.
J'ai dû retirer et remplacer le pod manuellement en procédant comme suit:
Cela devrait remettre la bibliothèque en question dans sa forme originale.
la source
Il est également intéressant de noter que si vous avez
libPods.a
ajouté deux fois, vous obtiendrez une erreur désagréable comme celle-ci:Pour résoudre ce problème, supprimez simplement l'une des
libPods.a
références dans votre Explorateur de projet.la source
Depuis CocoaPods 1.x, il existe une nouvelle façon de déclarer les dépendances partagées entre une cible et la cible de test correspondante. J'avais utilisé la solution acceptée par Mark Struzinski jusqu'à présent, mais l'utilisation de cette méthode a généré un nombre massif d'avertissements lors de l'exécution de mes tests:
Avec CocoaPods 1.x, nous pouvons déclarer notre cible -Test comme héritant via les chemins de recherche de la cible parent, comme ceci:
Cela permettra à la cible -Test d'accéder aux dépendances de la cible d'application, sans plusieurs copies binaires. Cela a considérablement accéléré les temps de construction des tests pour moi.
la source
Essayez ça, ça marche pour moi
Nous devons définir les pods dans les configurations,
Le projet-> Info-> Configurations dans le projet Xcode (votre projet) doit être défini sur le projet principal «Pods» pour le débogage, la publication (et ce que vous avez d'autre). Voir "En-têtes non trouvés - chemins de recherche non inclus"
J'espère que cela aide quelqu'un.
la source
Je travaille avec l'intégration de GoogleMaps Objective-C POD sur iOS avec mon application Swift.Pour moi, le problème était que la cible de test n'avait pas de référence au fichier d'en-tête de pont ( SWIFT_OBJC_BRIDGING_HEADER ) dans les paramètres de construction. Assurez-vous que les cibles de votre application et de votre application de test pointent vers cela afin que les appels d'API tiers (API de cartes, etc.) puissent être utilisés dans les tests unitaires rapides.
la source
import GoogleMaps
.La syntaxe suivante donne le meilleur résultat pour moi (testé sous cocoapod v.1.2.1):
https://github.com/CocoaPods/CocoaPods/issues/4626#issuecomment-210402349
Sans cela, j'ai des avertissements lors du test sur les symboles en double.
Après ces avertissements ont disparu.
la source
J'ai eu des problèmes avec OpenCV sous XCTest. Cela me donnait des erreurs d'éditeur de liens
Undefined symbols for architecture arm64
pour des classes commecv::Mat
. J'installe OpenCV via CocoaPods en utilisantpod 'OpenCV', '~> 2.0'
sous la cible principale. Peu importe à quel point j'ai essayé de placer la dépendance OpenCV sous la cible de test ou d'utiliserinherit! :search_paths
rien de tout cela n'a fonctionné. La solution était de créer unabstract_target
like so:Les commandes
pod deintegrate
&pod clean
qui aident à nettoyer le projet et à vous assurer que vous recommencez lors du test sont également utiles . Vous pouvez installer ces deux en utilisant[sudo] gem install cocoapods-deintegrate cocoapods-clean
.la source