web-dev-qa-db-fra.com

"Le module n'a pas été compilé pour les tests" lors de l'utilisation de @testable

J'essaie d'utiliser la nouvelle déclaration @testable de Swift 2 pour exposer mes classes à la cible de test. Cependant, je reçois cette erreur du compilateur:

enter image description here

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

118
hgwhittle

Dans votre cible principale, vous devez définir l'option Enable Testability build sur Oui.

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

196
sgaw

La solution est assez simple les gars. Assurez-vous de bien définir vos cases à cocher sous votre schéma d'application. Vous DEVEZ DÉCOCHER vos cibles de test pour Archive Build.

 enter image description here

8

Dans mon cas, j'ai utilisé une configuration de construction personnalisée pour les tests (appelée Test) et aussi cocoapods en tant que gestionnaire de dépendance.

J'ai dû ajouter les lignes suivantes à la fin de ma Podfile pour permettre 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, cocoapods définit ENABLE_TESTABILITY sur YES uniquement pour les générations Debug.

8
Tim

Ceci est probablement dû au fait que votre cible principale Enable Testability est définie sur NO. Vous devez le définir sur YES dans le schéma de débogage (utilisé pour l'exécution de vos tests).

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

La plupart du temps, il est déconseillé d'importer des frameworks avec ce préfixe afin de l'éviter. Si vous ne le pouvez pas, vous devriez Enable Testability dans 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

4
Samuel B.

Pour ceux d'entre vous qui rencontrent ce problème uniquement lors de l'exécution de Xcode Profiler: changez la configuration de construction du profil dans votre gestion des schémas vers celle pour laquelle la testabilité est activée - et ce serait un débogage dans la plupart des cas:

 enter image description here

4
Wladek Surala

La solution ci-dessus convient si vous utilisez des gousses/Carthage. Mais si vous utilisez des frameworks à partir d’iOS lui-même, par exemple. Contacts ', vous devez ajouter un chemin d'accès à ces cadres dans "Chemins de recherche de bibliothèque" de la cible de votre projet principal .  enter image description here

0
nikBhosale

Si vous essayez de tester le framework:

Aller à la cible de test -> Phase de construction -> Phase de création de nouveaux fichiers de copie -> Choisir les frameworks -> Ajouter tous les frameworks utilisés de manière récursive