Impossible de charger le module sous-jacent pour XCTest

180

Je travaille en swift sur Xcode et par défaut, il crée un fichier de test qui fait référence à XCTest.

Lorsque je définis l'appartenance cible à mon projet principal, cela provoque cette erreur

Impossible de charger le module sous-jacent pour XCTest

Si cette appartenance à la cible n'est pas définie, les tests s'exécutent correctement et tout fonctionne correctement.

PS: je suis nouveau pour Swift et c'est probablement une question stupide (s'il vous plaît, éclairez-moi)

brduca
la source
17
Il n'y a pas de questions stupides sauterelles, seulement des questionneurs stupides. ;-) Excellente question car tous ceux qui liront ceci auront le même problème.
Lance Kind

Réponses:

168

Le projet principal n'est pas lié au framework XCUnit. Vous devez créer une cible de test distincte pour votre projet, s'il n'en existe pas déjà, et ajouter vos fichiers source de test à cette cible.

  1. Sélectionnez votre projet dans le navigateur de projet. Cela ouvrira les paramètres du projet dans l'éditeur.
  2. Cliquez sur le bouton «+» en bas de la colonne répertoriant vos cibles.

entrez la description de l'image ici

  1. Si vous travaillez sur un modèle de projet iOS , sélectionnez iOS > Test > iOS Unit Testing Bundle.

    Si vous travaillez sur un modèle de projet OS X , sélectionnez OS X > Test > OS X Unit Testing Bundle.

pwc
la source
3
Pendant ce temps, pour iOS, il s'appelle iOS UITesting Bundle (utilisez-le pour les tests d'interface utilisateur) ou iOS Unit Testing Bundle (c'est pour les tests unitaires ...)
kuzdu
184

Vérifiez que le fichier en question n'est pas dans la cible principale mais uniquement dans la cible de test. Seule la cible de test aura ce cadre à importer.

Aaron Zinman
la source
16
Si ça aide. Sélectionnez votre cible «Non test» -> Phases de construction -> Sources de compilation. Assurez-vous que votre "ClassTest.swift" n'est pas dans la cible de construction normale.
Nick N
Et s'il se trouve dans le bundle principal et le bundle de test, comment le supprimer du bundle principal.
James Robinson
1
Merci @NickN, vous avez signalé le problème exact que j'avais et c'est résolu maintenant!
Naishta
SI c'est sur la cible de test, je ne parviens pas à accéder à l'une de mes principales méthodes de test dans ma cible principale.
UKDataGeek
merci cela a fonctionné comme un charme. supprimer simplement les fichiers de test a fonctionné.
Ccr
32

Vous venez d'ajouter votre fichier / classe de tests dans la cible principale et non dans la cible de test par erreur. Aussi simple que cela.

Solution:

1) Supprimez le fichier de test de la liste "Compiler les sources" dans l'onglet "Build Phases" de la cible principale

2) Ajouter le même fichier dans "Compile Sources" sur l'onglet "Build Phases" pour la cible de test

Il doit résoudre le problème

Alfishe
la source
15

J'obtiens cette erreur si je crée une cible de framework dynamique macOS, qui est liée à XCTest.framework(la cible est une cible de framework, pas une cible de test!).

Dans ce cas, le problème est résolu en ajoutant

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks

aux "Paramètres de construction / Chemins de recherche du cadre" du projet.

Stanislav Pankevich
la source
Parfait! Merci!
Lance Kind
9
Mieux: $(PLATFORM_DIR)/Developer/Library/Frameworksau cas où vous auriez plusieurs versions de Xcode installées sous des noms différents (par exemple, versions release et beta).
rob mayoff
Merci @robmayoff c'était la bonne solution ;-)
Oliver Pearmain
C'est la bonne réponse lors de la création d'un framework pour tester le support.
Daniel Wood le
7

Après beaucoup de dépannage et de rebond dans les pages de débordement de pile comme celle-ci, j'ai réussi à trouver un détail qui n'était pas mentionné sur les autres pages de dépannage de test d'unité iOS.

Si votre projet utilise CocoaPods, assurez-vous d'inclure votre cible de test imbriquée dans la cible de votre application principale. Votre fichier pod peut ne pas l'inclure si vous avez créé votre cible de test après son exécution pod init. Votre fichier pod devrait ressembler à ceci:

target 'YourApp' do
    target 'YourAppTests' do
        inherit! :search_paths
        # Pods for testing
    end
end

N'oubliez pas de sauvegarder votre fichier pod et de l'exécuter pod installaprès cela.

J'espère que ça aide!

Orlando G Rodriguez
la source
5

C'est peut-être un peu tard mais ce que vous devez faire est:

Cliquez sur Fichier> Nouveau> Cible> Bundle de tests unitaires iOS.

Et puis ajoutez vos tests là-dedans. Cela a fonctionné pour moi. Le problème était que je n'avais pas sélectionné créer des tests unitaires lors de la création de mon projet. J'espère que cela aide quelqu'un.

Clinton D'Souza
la source
2

Ce problème se produit deux fois dans votre projet.

  1. Lorsque vous n'ajoutez pas UnitTestingBundle dans votre projet lors de la création d'un nouveau projet.
  2. Lorsque vous installez CocoaPods dans votre projet, parfois pas à chaque fois.

1: Réponse:

  • Allez dans le fichier Cliquez sur Fichier.

  • Ensuite, vous voyez la première option Nouveau Cliquez dessus.

  • Après avoir cliqué dessus, vous voyez une option, cliquez sur la cible.

  • Et puis, dans la barre de recherche, le bundle de tests unitaires IOS et l'ajout d'un problème sont résolus.

  • si le compilateur ne peut pas vous donner la permission d'ajouter ceci, essayez la deuxième méthode quand est donné ci-dessous.

2. Répondez au problème de CocoaPod:

  • Accédez au produit Cliquez sur le produit.

  • Cliquez sur nettoyer ou appuyez sur cmd + k.

  • Problème résolu.

zeeshan Dar
la source
2

Bien que la réponse acceptée résout ce problème la plupart du temps, il existe un autre moyen de rencontrer cette erreur.

Si vous vous êtes déjà assuré que:

Comme souligné par @pwc @ nick-n et d'autres

  1. Le ClassTest.swiftfichier pour l'appartenance à la cible en s'assurant qu'il est uniquement attaché à la cible de test.
  2. Le ClassTest.swiftn'est pas visible sous la cible principale de votre application> Sources de construction> Sources de compilation

Voici ce que vous pouvez vérifier d'autre:

dans votre .podspecsdossier

Assurez-vous que votre source_filesn'inclut pas directement ou indirectement le répertoire de test.

par exemple :

s.source_files = ["Classes/**/*.{swift}", "Classes/**/*.{xib}"]
s.exclude_files = ["Classes/Exclude", "Classes/MyPodProjTests/"]

Notez que Classes/**/*.{swift}tout inclut tout ce qui remplace le fait que le répertoire MyPodProjTestsdoit être exclu.

Solution:

s.source_files = ["Classes/MyPodProj/**/*.{swift}", "Classes/**/*.{xib}"]

Remarque: il s'agit d'un cas extrêmement complexe et d'une erreur complètement humaine, mais je pensais que cela mériterait d'être souligné.

le signe d'été
la source
Excellente remarque, j'avais tout inclus dans mon s.source_files. Merci!
Mauricio Chirino
1

Assurez-vous que l'appartenance cible est cochée pour tous les modules lorsque le cadre de test est sélectionné. Vous pouvez afficher l'option d'appartenance cible en sélectionnant Affichage-> Utilitaires-> Afficher l'inspecteur de fichiers

karma
la source
1

Dans mon cas, je faisais les tests pour un pod privé, donc dans le podspec c'était comme:

s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/*.swift' end

Mais dans le Podfile, j'ai oublié d'apporter la spécification de test, en tant que telle:

target 'MyApp' do
use_frameworks!
pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests'] end
Hugo Jordao
la source
0

J'ai fait tout ce qui précède, mais je n'étais toujours pas autorisé à accéder aux méthodes que je voulais tester. Mais avant d'écrire un cas de test, j'ai construit le projet une fois, puis les méthodes étaient accessibles à tester. Alors essayez-le et faites-moi savoir si cela a résolu un problème.

sunil chayagol
la source
0

J'ai eu le même problème et la solution pour moi était de:

  1. Sélectionnez mon programme
  2. Modifier le schéma ...
  3. Ensuite, lorsque la fenêtre de configuration du schéma est ouverte, sélectionnez l'onglet de gauche nommé "Test" pour être redirigé ici: entrez la description de l'image ici
  4. Comme vous pouvez le voir, mes UITests ne sont pas ajoutés ici mais existent dans mon projet, je devais donc appuyer sur le bouton plus et sélectionner ma cible UITests comme ceci: entrez la description de l'image ici
  5. Appuyez ensuite sur le bouton "Ajouter" et fermez la vue de configuration
  6. Terminez par un nettoyage du projet et réessayez, cela devrait fonctionner
  7. Et n'oubliez pas de vérifier cela aussi: https://developer.apple.com/library/archive/qa/qa1954/_index.html

J'espère que cette réponse vous aidera.

PS: une dernière réflexion dans ma cible de test dans les paramètres de construction, j'ai dû vérifier ces propriétés qui n'étaient pas configurées correctement:

DEBUG_INFORMATION_FORMAT = dwarf; 
ONLY_ACTIVE_ARCH = YES;
VALIDATE_PRODUCT = NO;
O. Boujaouane
la source
0

Tout comme @Alfishe mentionné ci-dessus:

Vous devez supprimer les fichiers de test Compiler SourcessousBuild Phases

Comme indiqué ci-dessous


entrez la description de l'image ici

Suhaib
la source
1
Si vous faites cela, vous ne pouvez pas exécuter les tests, pour autant que je sache
Juan Curti
0

Vérifiez l'appartenance cible de votre classe de test.

Denis Kutlubaev
la source