'Le module n'a pas été compilé pour le test' lors de l'utilisation de @testable

147

J'essaye d'utiliser la nouvelle @testabledéclaration de Swift 2 pour exposer mes classes à la cible de test. Cependant, j'obtiens cette erreur de compilation:

entrez la description de l'image ici

Intervalsest le module qui contient les classes que j'essaie d'exposer. Comment puis-je me débarrasser de cette erreur?

hgwhittle
la source

Réponses:

239

Dans votre cible principale, vous devez définir l' Enable Testabilityoption de construction sur Oui.

Selon le commentaire de @earnshavian ci-dessous, cela ne doit être utilisé que sur les versions de débogage conformément aux notes de publication d'Apple: "Le paramètre de génération Activer Testability ne doit être utilisé que dans votre configuration de débogage, car il interdit les optimisations qui dépendent de la non-exportation de symboles internes depuis l'application ou le framework " https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

sgaw
la source
Salut, j'obtiens la même erreur mais je ne vois pas l'option d'activation de testabilité et j'utilise xcode 7. Une idée de ce que je dois faire?
user1601259
2
@ user1601259 - Vous pouvez trouver l'option en sélectionnant le projet de niveau supérieur, en allant dans Paramètres de construction et en regardant sous l'en-tête Options de construction.
hgwhittle
@hgwhittle - Lorsque je sélectionne le projet de niveau supérieur, tout ce que je vois dans les options de construction est "format d'informations de débogage" et "valider le produit de construction". Lorsque je sélectionne la cible dans les options de construction, je vois "le contenu intégré contient du code Swift". C'est tout. Lorsque je recherche dans les paramètres de construction, je ne le trouve pas. Est-ce à cause de xcode 7?
user1601259
1
Il est possible que vous ayez sélectionné "De base" dans vos "Paramètres de construction". Si vous sélectionnez "Tous" sur le côté gauche, vous verrez "Activer la testabilité"
Array
1
Comment cela devrait-il fonctionner exactement pour les versions de version, où les tests seront exécutés (si nécessaire @testable) mais doivent être soumis à l'App Store? Si Enable Testabilityc'est juste pour les versions de débogage, quel est le moyen de contourner cela? Dois-je extraire mon code de test pour la publication?
timgcarlson
15

Dans mon cas, j'ai utilisé une configuration de construction personnalisée pour les tests (appelée Test) et également en cocoapodstant que gestionnaire de dépendances

J'ai dû ajouter les lignes suivantes à la fin de mon Podfilepour activer la testabilité

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            if config.name == 'Test'
                config.build_settings['ENABLE_TESTABILITY'] = 'YES'
            end
        end
    end
end

Par défaut cocoapodsensembles ENABLE_TESTABILITYà YESseulement Debugbuilds

Tim
la source
8

Pour ceux d'entre vous qui rencontrent cela uniquement lors de l'exécution de Xcode Profiler: basculez la configuration de la construction du profil dans la gestion de votre schéma vers celle qui a activé la testabilité - et ce serait le débogage dans la plupart des cas:

entrez la description de l'image ici

Wladek Surala
la source
4

C'est probablement parce que votre objectif principal Enable Testabilityest défini sur NO. Vous devez le définir YESdans le schéma de débogage (qui est utilisé pour exécuter vos tests).

Si vous utilisez Carthage, ce problème peut être causé par l'importation de frameworks avec @testable, car ils sont générés avec un schéma de version.

La plupart du temps, il est déconseillé d'importer des frameworks avec ce préfixe, vous pouvez donc l'éviter. Si vous ne pouvez pas, vous devriez Enable Testabilitydans le schéma de publication des frameworks. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

Samuel B.
la source
2
Comment éviter d'importer des frameworks à l'aide de @testable? Quelle est la bonne pratique ici?
Jonathan Cabrera
3

J'ai commencé à avoir cette erreur lors de l'exécution de tests avec Bitrise.

Contrairement à d' autres utilisateurs dit, ce ne sont pas par Targetbase ou par Schemabase, il est par Configurationbase. Sélectionnez Target-> Build Settingsonglet -> recherchez testability-> Activez-le sur la configuration que vous utilisez .

Veuillez noter qu'Apple recommande de l'activer sur la configuration que vous utilisez pour le débogage, pas pour l'AppStore.

rgkobashi
la source
0

La solution ci-dessus convient si vous utilisez des pods / Carthage. Mais si vous utilisez des frameworks d'iOS lui-même «par exemple Contacts», vous devez ajouter un chemin vers ces frameworks dans «Library Search Paths» de la cible de votre projet principal. entrez la description de l'image ici

nikBhosale
la source
0

Si vous essayez de tester le framework:

Allez à la cible de test -> Phase de construction -> Phase de création de nouveaux fichiers de copie -> Choisissez des cadres -> Ajouter tous les cadres utilisés de manière récursive

Zaporozhchenko Oleksandr
la source
0

Si par hasard vous avez

install! 'cocoapods',
         generate_multiple_pod_projects: true,
         incremental_installation: true

Ensuite, c'est la façon de le faire.

    # generated_projects only returns results if the we run "pod install --clean-install"
    # or install a pod for the first time

    installer.generated_projects.each do |project|
        project.build_configurations.each do |configuration|
            configuration.build_settings["ENABLE_TESTABILITY"] = "YES" 
        end
    end
Nuno Gonçalves
la source
-3

Cela ne s'est pas produit dans mes projets avant Xcode 8, mais après la mise à niveau vers Xcode 8, cela m'a rendu perplexe.

Les réponses publiées ici n'ont pas résolu mes problèmes. Pour moi, j'ai juste abandonné ces tests car ils ne sont pas nécessaires. Alors décochez les boutons de test:

entrez la description de l'image ici Et maintenant, l'erreur a disparu.

Blaszard
la source
1
Si vous n'avez pas besoin des tests, il peut être préférable de supprimer les cibles de test de votre projet au lieu de les supprimer de toutes les versions.
Jonathan Cabrera