"Un tel module" lors de l'utilisation de @testable dans Xcode tests Unitaires
j'ai récemment mis à jour à Xcode 7 beta 5. J'ai essayé d'ajouter un test unitaire à un projet précédent, mais j'ai reçu le message d'erreur "no such module [myModuleName]" sur la ligne @testable import myModuleName
.
j'ai essayé
- nettoyage du projet avec Option dossier de construction propre
- vérification que " Activer la testabilité" (debug) a été défini à Oui dans les options de construction
- suppression de la cible d'essai et ajout du faisceau D'unités d'essai iOS
rien de tout cela n'a fonctionné pour ce projet (mais j'ai obtenu des tests pour travailler dans un autre projet). Quelqu'un d'autre a eu ce problème et l'a résolu?
19 réponses
veuillez vérifier le nom de votre Module que vous essayez d'importer avec @testable import "ModuleName"
. Le nom du module doit être le même sur Target->Build Settings-> Product Module Name
La réponse qui a fonctionné pour moi
la réponse était que j'avais quelques erreurs dans mon projet qui faisait échouer la construction. (C'était juste votre norme tous les jours bug dans le code. Après que j'ai corrigé les erreurs et fait un autre nettoyage et construire, il a fonctionné.
notez que ces erreurs ne sont pas apparues au début. Pour les faire venir:
- commentez l'ensemble de votre fichier Test le "module" de l'erreur.
- essayez de relancer votre projet.
S'il y a d'autres erreurs, elles devraient apparaître maintenant. Corrigez - les et décommentez votre code de fichier de Test. Le "module" erreur a disparu pour moi.
au cas où cela ne résoudrait 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 Option , et cliquez sur " Nettoyer le dossier de construction..."
s'assurer que la testabilité de L'option Enable est réglée sur Oui
dans le navigateur du projet, cliquez sur le nom de votre projet. Sélectionnez les paramètres de construction et faites défiler vers le bas pour construire des Options. Assurez-vous que la testabilité D'Enable est oui (pour débogage.)
supprimer et ajouter à nouveau votre cible de Tests
si vous avez fait le reste, je pense que vous n'avez probablement pas besoin de faire cela. Mais si vous le faites, n'oubliez pas de sauvegarder les tests unitaires que vous avez déjà écrits.
cliquez sur le nom de votre projet dans le projet Navigator. Ensuite, sélectionnez votre cible de Tests. Cliquez sur le bouton moins (-) en bas de la supprimer.
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 paquet de test D'UI de la même manière.
quelques autres idées
- s'assurer que tous les classes obligatoires sont membres de votre cible de test.
- assurez-vous que vous avez ajouté toutes les bibliothèques requises.
- s'assurer que le nom du module est écrit correctement (voir cette réponse ).
Ou...
laisser un commentaire ou une réponse ci-dessous si vous avez trouvé quelque chose d'autre qui a fonctionné.
Liées
le problème pour moi était que la cible de déploiement iOS des tests n'était pas réglée pour être la même que la cible principale. Donc, assurez-vous de vérifier cela.
dans votre cible de test:
Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
C'est ainsi que j'ai fait fonctionner mon code après avoir essayé toutes les solutions suggérées à partir de suggestions antérieures.
- j'ai mis "Activer la testabilité" à " OUI " au projet de construction de Paramètres
- j'ai aussi défini 'Defines Module' à 'YES' dans les paramètres de construction de mon projet.
- pour les réguliers .fichier(s) swift dans mon projet, dire MyApp , j'allais écrire des cas de test pour, j'ai les deux le principal " MyApp " et le " MyAppUnitTests Cible " vérifié sous Target Adhésion .
- j'ai ensuite sélectionné mon(S) fichier (s) d'essai unitaire, déclaré le ' @importation testable MyApp 'en haut, sous le' import XCTest ', et seulement coché le "Mesappunittests" sous Target membership
Et tout a fonctionné comme un charme. Espérons que cette aide.
un gotcha à surveiller est que si votre nom de module a un caractère de tiret en elle -
alors vous devrez y faire référence avec une barre inférieure à la place _
. Pour une raison que je soupçonne cela peut être un problème et c'était en effet mon problème.
par exemple. @testable import Ocean-Swift
devient @testable import Ocean_Swift
juste une autre chose, si vous utilisez la syntaxe @testable
assurez-vous de ne pas inclure votre code de production dans votre cible de test. J'ai trouvé cette va causer inexplicable bizarrerie.
Cela semble être une erreur avec les paramètres de construction de deux cibles. Vous devez vous assurer que:
-
ENABLE_TESTABILITY
égale Oui pour les deux cibles. - la valeur
PRODUCT_MODULE_NAME
de la cible d'essai doit différer de celle de l'application.
autre chose à vérifier: si vous avez un projet Objectif-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 Objectif-C, mais je voulais écrire des tests unitaires dans Swift.
j'ai ajouté un fichier Swift à la cible principale pour générer L'en-tête ProjectName-Bridging nécessaire.h fichier, é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 dans Objective-C... Je n'écrivais que des tests à Swift).
Je n'ai pas remarqué de problème jusqu'à ce que plus tard, après avoir fait un dossier" clean/clean build "et le problème" No Such Module " apparaisse. Après quelques égratignures, 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 il ne fonctionne qu'avec lui... donc, je vais soit avoir besoin de laisser le fichier vide dans le projet, de convertir certains objectifs-C en Swift, ou d'ajouter un nouveau code au projet écrit dans Swift.
assurez-vous que sous le paramètre de construction du programme de test, la cible de test est dans la liste.
à côté du bouton Lecture, sélectionnez le schéma de test, puis modifiez le schéma..., allez dans la section construire, cliquez plus + et sélectionnez la cible que vous voulez tester.
dans mon cas, nous avons une cible interne que nous développons avec (quelques différences mineures) et après une fusion, elle a été retirée de la configuration de test.
mon problème était que la classe que je voulais tester était supposée être dans un module séparé (API Client), mais la classe était en fait un membre de la cible app et non de la cible framework. Changer la composition cible de la classe a fait disparaître l'erreur d'importation!
j'ai eu ce même problème. Nettoyer le dossier de construction et redémarrer Xcode n'a pas fonctionné.
ce qui a fonctionné pour moi était de s'assurer que le réglage pour" construire L'Architecture Active seulement " de votre cible et schéma de test correspond au réglage de la cible et du schéma de votre application.
ma solution est ici.
Tout D'Abord OdeAlSwiftUITest.cliquez sur swift, puis vérifiez le projet TargetName dans l'adhésion cible.
Environnement: Xcode Version 9.0 (9A235)
Scénario: Test d'une structure open-source.
J'ai eu le même problème: "Pas de tel module".
Solution:
- sélectionner la cible D'essai.
- Sélectionner Les Phases De Construction
- ajouter le cadre à être testé via le lien Binaire...
j'ai suivi les étapes ci-dessus, qui ont fonctionné. Cependant, mon projet avait d'autres problèmes. J'ai reçu cet avertissement et je ne pouvais pas accéder aux classes de mon projet principal pour tester dans ma cible de test.
j'ai trouvé que le nom de votre Module produit cible (YourTestTarget -> paramètres de Construction -> Recherche de product module
) ne peut pas être le même que le nom de votre projet.
une fois que j'ai changé le nom du Module produit pour ma cible d'essai, tout a fonctionné.
en plus des 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 de l'unité
pour moi la solution était de renommer @testable importation myproject_ios de @testable importation myproject après avoir mis à jour le nom du produit de la cible myproject-ios dans les paramètres de construction/empaquetage/nom du produit/ de ${TARGET_NAME} à myproject.
cela a été corrigé pour moi lorsque j'ai changé la " de déploiement cible de 9.3 à 11.0.
Général > Cible De Déploiement > "11.0"
si vous utilisez xcodebuild et que vous trouvez ce problème, envisagez d'ajouter un drapeau workspace à la commande build.
A Changé Ce
$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test
À Ce
$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
dans la cible de test des paramètres de construction, vérifiez le test de l'hôte, il prend le nom défini dans PRODUCT_NAME. C'est ce nom que vous devriez utiliser dans les classes de test.
je recommande de ne pas changer PRODUCT_NAME (match name of the main target)
comme décrit dans cette réponse j'ai ajouté des tests Swift à un projet Obj-C seulement. La solution était d'ajouter une classe fictive Swift, après quoi Xcode inviterait à ajouter un en-tête passerelle, puis à supprimer la classe Swift. Tout était très bien, après que.