Les tests unitaires Swift 2.0, @testable à l'importation, et d'un système de ciblage des questions
Récemment, j'ai converti mon application, et les tests unitaires sur Swift 2.0. Je suis à l'aide de @testable import AppName
dans mes Tests.swift fichiers.
En raison d'un problème de ne pas être en mesure d'exécuter les sous-classes dans plusieurs cibles (voir ici pour la question), ma classe EntityName
ne peut être la Cible d'Adhésion AppName
, et PAS AppNameTests
.
Le problème est, une fois que j'ai passer de l'un à l' AppNameTests
schéma pour exécuter les tests unitaires, le code dans le module AppName
ne peut pas trouver la classe EntityName
et je reçois
Utilisation non déclaré type "EntityName'
Comment puis-je obtenir AppName
de compilation lors de l'exécution de tests à partir de la AppNameTests
régime sans que la classe d'entité n'est pas membre de ce régime?
Vous devez vous connecter pour publier un commentaire.
Lors de la compilation du même code Swift dans le cadre de différentes cibles, le compilateur génère différentes classes. Donc, cela se comporte comme prévu, mais il est presque certainement pas ce que vous voulez lors de l'exécution d'une application des tests unitaires.
Il y a deux façons que je vous recommande de configurer vos modèles pour permettre de tester:
1. Les modèles publics (recommandé)
Dans votre application cible:
Ce code doit seulement être compilés dans le cadre de votre application cible, et des tests unitaires peut être défini de la manière suivante:
Assez facile?
2. @Testable (Swift 2 uniquement)
Cette approche repose sur la
@testable
mot-clé introduit dans Swift 2.Dans votre application cible:
Encore une fois, ce code doit seulement être compilés dans le cadre de votre application cible, et des tests unitaires peut être défini de la manière suivante:
Assurez-vous que MyApp de paramètres de construction ont
Enable Testability
ensemble deYES
.Cette approche peut être préféré au public des modèles si vous êtes en train de construire un cadre où certains des modèles internes ne devraient pas être accessibles par les utilisateurs de ce cadre.
Domaine dispose d'une section dédiée de leur documentation détaillant ces approches communes en matière de tests que vous pouvez lire ici: https://realm.io/docs/swift/latest/#avoid-linking-realm-and-tested-code-in-test-targets
J'ai dû cesser de prendre pour cible l'ensemble de mon apps .swift fichiers ont des membres de MyAppTests, et se fonder uniquement sur
@testable import MyApp
MyApp
doit être le produit nom du module dans votre projet (Paramètres -> Cible> Paramètre de construction -> Produit Nom du Module)J'ai aussi eu cette erreur récemment et aucune des étapes ci-dessus a résolu le problème, ce n'fixer c'était la suppression non-swift fichier à partir de la Compiler les sources phase de construction dans la Cible que vous souhaitez exécuter des tests sur. Ce n'était pas silencieusement
D'abord s'assurer que
@testable import MyApp
est inclus dans chaque fichier de test. Puis, dans votre Test Cible Phases de construction, de supprimer tous les non-test des fichiers de la Copie de Bundle de Ressources des sections. Des fichiers d'application sont à votre cible de test qui pointent vers les fichiers d'application qui ne sont pas dans votre cible de test sont la rupture des tests unitaires. Supprimer tous les fichiers d'application à partir de votre cible de test et ajouter le@testable
drapeau et tout devrait fonctionner!J'ai eu le même problème et le problème était que tous les fichiers source de l'application ont été liés à l'unité de test de la cible, et donc compilé deux fois!
Aussi, j'ai installé Royaume via Carthage et devait inclure à la fois les cibles (principal et de test) pour les cadres "du Royaume.cadre" et "RealmSwift.cadre" parce qu'il ne serait pas travailler autrement.
Ici est la question du lien
https://github.com/realm/realm-cocoa/issues/3627