web-dev-qa-db-fra.com

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

J'ai récemment mis à jour Xcode 7 beta 5. J'ai essayé d'ajouter un test unitaire à un projet précédent, mais le message d'erreur "Aucun module [myModuleName]" s'affiche sur la ligne @testable import myModuleName.

enter image description here

J'ai essayé

  • nettoyer le projet avec Option Dossier de construction propre
  • vérifier que "Enable Testability" (débogage) a été défini sur Oui dans les options de construction
  • suppression de la cible de tests, puis ré-ajout du kit de tests d'unités iOS.

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

123
Suragch

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 standard quotidien dans le code.) Après avoir corrigé les erreurs et procédé à un nouveau nettoyage et à une nouvelle génération, cela a fonctionné.

Notez que ces erreurs ne sont pas apparues au début. Pour les amener à se présenter:

  • Mettez en commentaire l'ensemble de votre fichier de test qui vous donne l'erreur "Aucun module de ce type".
  • Essayez de relancer votre projet.

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


Si cela ne résout pas le problème pour d'autres personnes, vous pouvez également essayer les solutions suivantes:

Nettoyer le dossier de construction

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

enter image description here

Assurez-vous que l'option Activer la testabilité est définie 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).

enter image description here

Supprimez et rajoutez votre cible de tests

Si vous avez fait les autres choses, je suppose que vous n’avez probablement pas besoin de faire cela. 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. Ensuite, sélectionnez votre cible de tests. Cliquez sur le bouton moins (-) en bas pour le supprimer.

enter image description here

Cliquez ensuite sur le bouton plus (+) et choisissez iOS Unit Testing Bundle pour le rajouter. Comme vous pouvez le constater, vous pouvez également ajouter un ensemble de tests 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 d'avoir 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 qui a fonctionné.

Connexes

103
Suragch

Veuillez vérifier le nom du module que vous essayez d'importer avec @testable import "ModuleName". Le nom du module devrait être le même sur Target->Build Settings-> Product Module Name

146
Voda Ion

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

Dans votre cible de test:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
47
Jess

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

  • Je règle 'Activer la testabilité' sur 'OUI' dans les paramètres de construction du projet
  • J'ai également défini "Defines Module" sur "YES" dans les paramètres de construction de mon projet.
  • Pour le (s) fichier (s) .Swift normal (s) de mon projet, par exemple, MyApp, j'allais écrire des scénarios de test pour, j'ai les deux le principal "MyApp" et le fichier "MyAppUnitTests" Cibles contrôlées sous Adhésion à la cible.
  • J'ai ensuite sélectionné mon (mes) fichier (s) de test unitaire, déclaré l’importation '@testable MyApp' en haut, sous le 'import XCTest', et uniquement coché la case "MyAppUnitTests" sous abonnement cible

Et tout a fonctionné comme un charme. J'espère que cela t'aides.

22
Vick Swift

Une chose à surveiller est que si votre nom de module contient un tiret -, vous devrez vous y référer avec une barre de soulignement au lieu de _. Pour une raison quelconque, je soupçonnais que cela pouvait être un problème et c'était effectivement mon problème.

par exemple. @testable import Ocean-Swift devient @testable import Ocean_Swift

Autre chose, si vous utilisez la syntaxe @testable, veillez à ne pas inclure votre code de production dans votre cible de test. J'ai trouvé que cela causerait une bizarrerie inexplicable.

15
smileBot

Une autre chose à vérifier: si vous avez un projet Objective-C, mais é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 dans 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 ne pas en avoir 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 que le problème «Aucun module» se soit présenté. Après quelques critiques, 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 ce dernier ... je vais donc soit devoir laisser le fichier vide dans le projet, convertir certains Objective-C en Swift ou en ajouter d'autres. nouveau code au projet écrit en Swift.

9
Jim Rhoades

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

  • ENABLE_TESTABILITY est égal à Oui pour les deux cibles.
  • La valeur PRODUCT_MODULE_NAME de la cible de test doit être différente de celle de l'application.
7
yageek

Assurez-vous que dans les paramètres 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 ..., accédez à la section Générer, cliquez sur plus + et sélectionnez la cible que vous souhaitez tester.

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

 Edit test scheme

5
BrianHenryIE

Ma solution est ici.

Cliquez d'abord sur OdeAlSwiftUITest.Swift, puis cochez Project TargetName dans l'appartenance à la cible.

 enter image description here

5
eyupcimen

Après avoir passé quelques jours sur ce sujet, je me suis enfin mis au travail avec mon projet. Le problème était dans l'en-tête de pontage - le chemin dans la cible de tests ne peut pas être vide si vous utilisez un en-tête de pontage dans votre cible principale Bridging Header can't be empty!!!

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

4
Igor P

Voici encore une autre chose à vérifier qui ne figure pas dans la liste. 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 contrat de licence! Une fois que j'ai sélectionné une équipe différente dans les paramètres généraux de ma cible, et que j'ai ensuite spécifié une cible de déploiement spécifique, telle que 12.1 ou 11.0, l'avertissement "Aucun module de ce type" a soudainement disparu.

 enter image description here

 enter image description here

4
Dave Levy

J'ai eu le même problème. Le nettoyage du dossier de construction et le redémarrage de Xcode ne fonctionnaient pas. 

Pour moi, ce qui a fonctionné a été de veiller à ce que le paramètre "Construire une architecture active uniquement" de votre cible et modèle de test corresponde au paramètre de la cible et du modèle de votre application.

2
palmi

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

J'ai eu le même problème: "Aucun module de ce type" .

Solution:

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

 enter image description here

Voici le fichier de test:  enter image description here

2
Frederick C. Lee

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

2
Maciej Swic

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

 Tests part of module - ignoring import

J'ai constaté que votre nom de module de produit cible cible (YourTestTarget -> Paramètres de construction -> recherche de product module) ne peut pas être identique à votre nom de projet.

 Product Module Name for test target cannot be the same name as your project name

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

 enter image description here

1
Bryan Norden

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

0
Matthias

Dans la cible de test des paramètres de construction, cochez 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)

0
Sam

Ce problème a été résolu pour moi lorsque j'ai modifié la cible Deployment Target de 9.3 à 11.0.

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

0
user9226093

enter image description here

Cliquez sur MyAppTests.Swift dans le navigateur de projet, puis cliquez sur le panneau de droite pour vérifier votre module dans l'appartenance à la cible. Cela fonctionne dans le mien.

0
Firda Sahidi

Outre les éléments énumérés, je devais ajouter le fichier avec la classe que je tentais de tester dans mes sources de compilation pour le module de test unitaire  enter image description here

0
Matt D

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

Changé cela

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

Pour ça

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
0