"Aucun module de ce type" lors de l'utilisation de @testable dans les tests unitaires Xcode

168

J'ai récemment mis à jour vers Xcode 7 beta 5. J'ai essayé d'ajouter un test unitaire à un projet antérieur, mais j'obtiens le message d'erreur "No such module [myModuleName]" sur la @testable import myModuleNameligne.

entrez la description de l'image ici

j'ai essayé

  • nettoyage du projet avec OptionClean Build Folder
  • vérifier que «Activer la testabilité» (débogage) était défini sur Oui dans les options de construction
  • suppression de la cible de tests, puis réajout du bundle de tests unitaires iOS

Rien de tout cela n'a fonctionné pour ce projet (mais j'ai fait des tests pour travailler dans un autre projet). Quelqu'un d'autre a-t-il eu ce problème et l'a-t-il résolu?

Suragch
la source
Si vous construisez à partir de la ligne de commande avec xcodebuild, assurez-vous d'ajouter l'indicateur -workspace pour votre commande de construction. J'ai résolu ce problème sur mon voyage construit de cette façon.
Victor 'Chris' Cabral

Réponses:

210

Veuillez vérifier le nom de votre module avec lequel vous essayez d'importer @testable import "ModuleName". Le nom du module doit être le même surTarget->Build Settings-> Product Module Name

Voda Ion
la source
5
La plupart du temps, il s'agit du nom du module produit. Check spaceand_
onmyway133
5
faites attention à -et _. Un de mes projets a moins -dans le nom, mais le module a un trait de soulignement à la _place
béryllium
4
J'ai utilisé l' ""idée et j'ai obtenuExpected identifier in import declaration
abbood
1
@ onmyway133 était très proche. Dans mon cas, j'avais un nom de module de produit différent de celui de mon projet. Pour trouver le nom de votre module, Build Settingssélectionnez votre projet (pas le test ou le test de l'interface utilisateur), puis recherchez PRODUCT_MODULE_NAMEce qui apparaît ici est ce qui devrait aller après@testable import
jonmecer
115

La réponse qui a fonctionné pour moi

La réponse était que j'avais des erreurs dans mon projet qui faisaient échouer la construction. (C'était juste votre bogue quotidien standard dans le code.) Après avoir corrigé les erreurs et fait un autre nettoyage et compilation, cela a fonctionné.

Notez que ces erreurs ne sont pas apparues au début. Pour les faire apparaître:

  • Mettez en commentaire l'intégralité de votre fichier Test qui vous donne l'erreur "No such module".
  • Essayez à nouveau d'exécuter votre projet.

S'il y a d'autres erreurs, elles devraient apparaître maintenant. Corrigez-les, puis décommentez le code de votre fichier de test. L'erreur "No such module" a disparu pour moi.


Si cela ne résout pas le problème pour d'autres personnes, vous pouvez également essayer ce qui suit:

Nettoyer le dossier de construction

Ouvrez le menu Produit, maintenez Optionet cliquez sur "Nettoyer le dossier de construction ..."

entrez la description de l'image ici

Assurez-vous que Activer la testabilité est défini sur Oui

Dans le navigateur de projet, cliquez sur le nom de votre projet. Sélectionnez Paramètres de construction et faites défiler jusqu'à Options de construction. Assurez-vous que Activer la testabilité est Oui (pour le débogage).

entrez la description de l'image ici

Supprimer et rajouter votre cible de tests

Si vous avez fait les autres choses, je suppose que vous n'avez probablement pas besoin de le faire. Mais si vous le faites, n'oubliez pas de sauvegarder tous les tests unitaires que vous avez déjà écrits.

Cliquez sur le nom de votre projet dans le navigateur de projet. Sélectionnez ensuite votre cible de tests. Cliquez sur le bouton moins (-) en bas pour le supprimer.

entrez la description de l'image ici

Cliquez ensuite sur le bouton plus (+) et choisissez iOS Unit Testing Bundle pour l'ajouter à nouveau. Comme vous pouvez le voir, vous pouvez également ajouter un bundle de test d'interface utilisateur de la même manière.

Quelques autres idées

  • Assurez-vous que toutes les classes requises sont membres de votre cible de test.
  • Assurez-vous que vous avez ajouté toutes les bibliothèques requises.
  • Assurez-vous que le nom du module est écrit correctement (voir cette réponse ).

Ou...

Laissez un commentaire ou une réponse ci-dessous si vous avez trouvé quelque chose d'autre qui a fonctionné.

en relation

Suragch
la source
2
Ayant tous les mêmes problèmes ici, avec Xcode 7 beta 5. Malheureusement, les étapes ci-dessus ne semblent pas le résoudre - le module est toujours considéré comme "aucun module de ce type" Utilitaire "." La seule différence avec vos captures d'écran est que j'essaie de faire fonctionner cela avec le dossier de tests de l'interface utilisateur (GlimpulseUITests dans mon cas). @Testable ne fonctionne-t-il pas avec la cible de test de l'interface utilisateur?
Zac
5
*** IMPORTANT *** Si vous supprimez et rajoutez votre cible de test, il recréera un modèle de test vierge écrasant vos tests existants. Assurez-vous de sauvegarder vos sources de test avant de faire cela.
pauln
2
Pour moi, même mes classes individuelles n'étaient pas affichées lors de la frappe ... J'ai finalement fait Produit> Nettoyer, redémarré XCode. Quand il a redémarré, je lui ai donné quelques secondes pour terminer l'indexation, puis toutes mes références sont apparues sans avoir à inclure chaque classe en tant que membre de la cible de test.
Rajive Jain
1
Aussi, si vous ne l'avez pas essayé, cliquez sur votre framework manquant à gauche, puis à droite sélectionnez "Adhésion cible" et incluez-le dans votre cible de test unitaire.
albogdano
3
Accédez aux paramètres de construction de votre cible principale -> "Nom du module de produit" et voyez s'il correspond au nom du module que vous essayez d'importer dans votre test.
f0rz
64

Le problème pour moi était que la cible de déploiement iOS des tests n'était pas définie pour être la même que la cible principale. Assurez-vous donc de vérifier cela.

Dans votre cible de test:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
Jess
la source
Après avoir fait cela, je devais mettre Enable Bitcodeà Nosur le faisceau de test.
pableiros
2
Lol cela fonctionne mais comment stupide de Xcode qu'il doens't jeter une autre erreur
Doe J.
31

C'est ainsi que j'ai procédé pour faire fonctionner mon code après avoir essayé toutes les solutions suggérées à partir des suggestions précédentes.

  • J'ai défini 'Activer la testabilité' sur 'OUI' dans les paramètres de construction du projet
  • J'ai également défini «Définit le module» sur «OUI» dans les paramètres de construction de mon projet.
  • Pour le (s) fichier (s) .swift normal (s) dans mon projet, disons MyApp , j'allais écrire des cas de test pour, j'ai à la fois les cibles principales " MyApp " et " MyAppUnitTests " cochées sous Adhésion cible .
  • J'ai ensuite sélectionné mon (mes) fichier (s) de test unitaire, déclaré le ' @testable import MyApp ' en haut, sous ' import XCTest ', et vérifié uniquement les "MyAppUnitTests" sous l' appartenance cible

Et tout fonctionnait comme du charme. J'espère que cela t'aides.

Vick Swift
la source
8
Activer la testabilité et définit le module est ce qui a fait le tour. Je n'ai pas eu besoin de modifier les adhésions cibles pour les fichiers * .swift normaux.
George Yacoub
J'ai effectué toutes les étapes ci-dessus mais je n'ai toujours pas d'erreur de module de ce type. mon projet est un mix d'obj c rapide
Mikael
@Mikael, écrivez-vous des tests uniquement pour les fichiers Swift de votre base de code de mélange Objc / Swift? (Je demande parce que, la dernière fois que j'ai vérifié, je pense que l '' importation @testable 'n'a fonctionné que pour écrire des cas de test uniquement pour les fichiers Swift, même dans le mélange de base de code Obj-c / Swift. Cela a probablement changé maintenant. Quelqu'un m'a corrigé si je me trompe ici).
Vick Swift
6
J'ai trouvé mon problème. C'était parce que l'architecture valide de ma cible de test n'était pas la même que la configuration de l'architecture valide de ma cible principale. Maintenant ça marche. Btw, je ne teste que des classes Swift dans mon cas, je n'ai pas essayé pour Obj-c
Mikael
3
Vous ne devez pas ajouter les fichiers Swift de l'application à votre cible de test, cela rendra leur contenu dupliqué lors de l'exécution des tests.
Przemysław Wrzesiński
18

Un problème à surveiller est que si le nom de votre module contient un tiret, -vous devrez vous y référer avec un tiret à la place _. Pour une raison quelconque, je soupçonnais que cela pourrait être un problème et c'était en effet mon problème.

par exemple. @testable import Ocean-Swiftdevient@testable import Ocean_Swift

Juste une autre chose, si vous utilisez la @testablesyntaxe, assurez-vous de ne pas inclure votre code de production dans votre cible de test. J'ai trouvé que cela causerait une bizarrerie inexplicable.

smileBot
la source
1
tous les caractères non alphanumériques doivent également être remplacés par le trait de soulignement. Ma cible était dans ce format App (Dev), le module testable est devenuApp__Dev_
mushcraft
11

Cela semble être une erreur avec les paramètres de construction des deux cibles. Vous devez vous assurer que:

  • ENABLE_TESTABILITY équivaut à Oui pour les deux cibles.
  • La PRODUCT_MODULE_NAMEvaleur de la cible de test doit différer de celle de l'application.
yageek
la source
2
Cela a fonctionné pour moi. J'utilisais le mauvais nom de module. Je supprimais l'espace au lieu d'ajouter un _. DOUBLE VÉRIFIEZ LES NOMS DE VOTRE MODULE DE PRODUIT DANS LES PARAMÈTRES DE CONSTRUCTION
MoralCode
9

Une autre chose à vérifier: si vous avez un projet Objective-C, mais que vous écrivez des tests unitaires dans Swift, assurez-vous que la cible principale utilise au moins un fichier Swift!


Plus d'informations:

Je travaillais sur un projet Objective-C, mais je voulais écrire des tests unitaires en Swift.

J'ai ajouté un fichier Swift à la cible principale pour générer le fichier ProjectName-Bridging-Header.h nécessaire, écrit mes tests et tout fonctionnait correctement.

Plus tard, j'ai supprimé le fichier Swift parce que je pensais que je n'en avais pas besoin (tout le code de la cible principale est en Objective-C ... je n'écrivais que des tests en Swift).

Je n'ai remarqué un problème que plus tard, après avoir fait un "dossier de construction propre / propre" et le problème "No Such Module" est apparu. Après avoir gratté la tête, j'ai ajouté un nouveau fichier Swift vierge et le problème a disparu.

Je l'ai testé plusieurs fois avec / sans le fichier Swift, et cela ne fonctionne qu'avec lui ... donc, je devrai soit laisser le fichier vide dans le projet, convertir une partie d'Objective-C en Swift, soit en ajouter nouveau code du projet écrit en Swift.

Jim Rhoades
la source
1
!! après 3 heures de nettoyage, suppression des données récupérées, nettoyage, à partir de zéro 3 fois, j'ai trouvé votre commentaire qui a résolu mon problème !!! Merci !!!!
Maryam Fekri
Savez-vous comment accéder aux classes Objective-C dans les classes de test Swift, car j'importe le module de projet et il n'y a pas d'erreur avec cela, mais il ne reconnaît toujours pas mes classes Objective-C. dois-je faire autre chose?
Maryam Fekri
Un point supplémentaire que je voudrais ajouter, bien que mon projet principalement ObjC ait au moins un fichier Swift, il n'y avait pas d'en-tête de pontage pour ma cible. En suivant les instructions du lien suivant sous la rubrique "Importer du code dans une cible d'application", il a été résolu de pouvoir accéder aux classes ObjC à partir de tests Swift. developer.apple.com/documentation/swift/…
palmi
J'ai rencontré ce problème. Cependant, je suis intéressé à trouver un moyen d'éviter d'inclure le fichier Swift si possible, j'ai donc posé la question ici: stackoverflow.com/q/62965954/211292
ThomasW
En fait, il semble que si vous n'incluez pas la @testable import Fooligne, vos tests unitaires devraient s'exécuter correctement.
ThomasW
9

Pour ceux qui ont fait défiler jusqu'à la dernière réponse et toujours rien n'a fonctionné, voici ce qui l'a fait pour moi après avoir suivi tous les autres conseils de réponses. J'utilise Xcode 11:

Ce qui a causé le problème dans mon cas, c'est que j'ai changé le nom de mon produit

  1. J'ai changé le nom de mon produit dans les paramètres de construction de ma cible principale en "Nouveau nom"
  2. J'ai dû resélectionner l' application hôte pour ma cible de test
  3. Je ne savais pas que changer le nom du produit changerait également le nom du module produit , c'est-à-dire celui utilisé pour l'importation du module dans mes fichiers de test. J'ai changé mon import comme suit:

    @testable import New_Name

  4. Ça a marché

J'espère que ça aide

SwissMark
la source
7

Après avoir passé quelques jours sur ces questions, je parviens enfin à travailler avec mon projet. Le problème était dans l'en-tête de pont - le chemin dans la cible Tests ne peut pas être vide si vous utilisez l'en-tête de pont dans votre cible principaleL'en-tête de pont ne peut pas être vide !!!

J'espère que cela fera gagner du temps à quelqu'un.

Igor P
la source
5

Assurez-vous que sous le paramètre de construction du schéma de test, la cible de test est dans la liste.

À côté du bouton de lecture, sélectionnez le schéma de test, puis Modifier le schéma ..., allez dans la section Construire, cliquez sur plus + et sélectionnez la cible que vous souhaitez tester.

Dans mon cas, nous avons une cible interne avec laquelle nous développons (quelques différences mineures) et après une fusion, elle a été supprimée de la configuration de test.

Modifier le schéma de test

BrianHenryIE
la source
5

Voici encore une autre chose à vérifier qui n'est pas répertoriée. Pour moi, cela avait quelque chose à voir avec mon équipe, peut-être parce que l'agent de notre équipe n'avait pas encore accepté le dernier accord de licence! Une fois que j'ai sélectionné une équipe différente dans les paramètres généraux de ma cible, ET ensuite j'ai spécifié une cible de déploiement spécifique telle que 12.1 ou 11.0, l'avertissement "No Such Module" a soudainement disparu.

entrez la description de l'image ici

entrez la description de l'image ici

Dave Levy
la source
4

Dans mon cas, j'ai eu 3 problèmes. La première était que je devais spécifier le chemin d'importation dans:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

La seconde était que j'utilisais des pods et que je devais également importer ces pods dans mes tests en utilisant:

target 'MyAppTests' do
    inherit! :complete
end

Le troisième étant que j'utilisais un en-tête de pontage dans ma cible, j'ai donc dû spécifier l'en-tête de pontage pour qu'il soit le même pour le test.

el3ankaboot
la source
2

Mon problème était que la classe que je voulais tester était censée être dans un module séparé (client API), mais la classe était en fait un membre de la cible de l'application et non de la cible du framework. La modification de l'appartenance cible de la classe a fait disparaître l'erreur d'importation!

Maciej Swic
la source
2

Environnement: Xcode Version 9.0 (9A235)
Scénario: Test d'un framework open-source.

J'ai eu le même problème: «No such module».

Solution:

  1. Sélectionnez la cible de test.
  2. Sélectionnez les phases de construction
  3. Ajouter le framework à tester via Link Binary ...

entrez la description de l'image ici

Voici le fichier de test: entrez la description de l'image ici

Frederick C. Lee
la source
2

J'ai eu ce même problème. Le nettoyage du dossier de construction et le redémarrage de Xcode n'ont pas fonctionné.

Ce qui a fonctionné pour moi, c'est de m'assurer que le paramètre "Créer une architecture active uniquement" de votre cible de test et de votre schéma correspond au paramètre de la cible et du schéma de votre application.

palmi
la source
2

J'ai suivi les étapes ci-dessus, qui ont fonctionné. Cependant, mon projet avait quelques problèmes supplémentaires. J'ai reçu cet avertissement et je n'ai pas pu accéder aux classes de mon projet principal à tester dans ma cible de test.

Teste une partie du module - ignorant l'importation

J'ai trouvé que le nom de votre module de produit cible de test (YourTestTarget -> Build Settings -> search for product module) ne peut pas être le même nom que le nom de votre projet.

Le nom du module de produit pour la cible de test ne peut pas être le même que celui de votre projet

Une fois que j'ai changé le nom du module de produit pour ma cible de test, tout a fonctionné.

entrez la description de l'image ici

Bryan Norden
la source
1

J'ai essayé toutes les réponses ici mais le drapeau rouge ne disparaîtrait pas. Mais je l'ai fait fonctionner en "exécutant" un test vide de toute façon et il s'est éclairci.

Les choses que je voudrais m'assurer sont faites:

  • Application hôte
  • @testable import "Module_name" (assurez-vous que le nom du module est correct)
  • Assurez-vous que la cible de déploiement pour le test est la même que le projet
  • XCTest n'a pas besoin d'être membre de Target
Alexandre
la source
0

Pour moi, la solution était de renommer @testable import myproject_ios en @testable import myproject après avoir mis à jour le nom du produit de la cible myproject-ios dans Build Settings / Packaging / Product Name / de $ {TARGET_NAME} à myproject.

Matthias
la source
0

Ce problème a été résolu pour moi lorsque j'ai changé la cible de déploiement de 9.3 à 11.0.

Général> Cible de déploiement> "11.0"

jacob_g
la source
cela pourrait être plus le cas du changement de simulateurs, mais cela a également fonctionné pour moi
RolandasR
0

Ma solution est ici.

Tout d'abord, cliquez sur OdeAlSwiftUITest.swift, puis vérifiez Project TargetName dans l'appartenance cible.

entrez la description de l'image ici

eyup
la source
8
C'est faux. N'ajoutez jamais vos fichiers de test à votre cible.
smileBot
0

Si vous utilisez xcodebuild et trouvez ce problème, envisagez d'ajouter un indicateur d'espace de travail à la commande build.

Cela a changé

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

Pour ça

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
Victor 'Chris' Cabral
la source
0

Dans la cible de test des paramètres de build, vérifiez le test de l'hôte, il prend le nom défini dans PRODUCT_NAME. C'est ce nom que vous devez utiliser dans les classes de test.

Je recommande de ne pas changer PRODUCT_NAME (correspond au nom de la cible principale)

Sam
la source
0

entrez la description de l'image ici

Cliquez sur MyAppTests.swift dans le navigateur de projet, puis cliquez sur le panneau de droite, vérifiez votre module dans l'appartenance cible. Cela fonctionne dans le mien.

Firda Sahidi
la source
Vous ne devez pas ajouter de classes de test à votre cible d'application.
Alex Motor le
-1

Comme décrit dans cette réponse, j'ajoutais des tests Swift à un projet Obj-C uniquement. La solution était d'ajouter une classe Swift factice, après quoi Xcode inviterait à ajouter un en-tête de pontage, puis supprimait la classe Swift. Tout allait bien après ça.

funkybro
la source
-1

J'ai ajouté aux autres choses énumérées, j'ai dû ajouter le fichier avec la classe que j'essayais de tester à mes sources de compilation pour le module de test unitaireentrez la description de l'image ici

Matt D
la source
-1

Je pense que cela peut être arrivé parce que j'ai supprimé les exemples de tests.

J'ai supprimé le bundle de test unitaire, puis l'ai ré-ajouté comme indiqué dans les images ci-dessous et tout allait bien à nouveau.

entrez la description de l'image ici

entrez la description de l'image ici

Declan McKenna
la source