Tests unitaires Swift 2.0, @testable import, et questions de ciblage scheme
j'ai récemment converti mon application, et les tests unitaires sur Swift 2.0. Je suis à l'aide de @testable import AppName
dans mes Tests.fichiers swift.
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 .
le problème est, une fois que je passe à la AppNameTests
schéma pour exécuter des tests unitaires, code dans le module AppName
ne trouve pas la classe EntityName
et j'obtiens
Utilisation du type non déclaré 'EntityName'
Comment puis-je obtenir AppName
compiler lors de l'exécution de tests à partir du AppNameTests
sans cette catégorie d'entités, n'est-ce pas un membre du régime?
5 réponses
en Raison d'un problème de ne pas être en mesure d'exécuter les sous-classes dans plusieurs cibles
lors de la compilation du même code Swift dans le cadre de cibles différentes, le compilateur génère en fait classes différentes. Donc, cela se comporte comme prévu, mais est presque certainement pas ce que vous voulez lors de l'exécution des tests unitaires d'une application.
il y a deux façons de configurer vos modèles pour permettre les tests:
1. Les modèles publics (recommandé)
dans votre cible app:
import RealmSwift
public class MyModel: Object {}
ce code devrait être compilé dans le cadre de votre cible d'application, et vos tests unitaires peuvent être configurés de la manière suivante:
import MyApp
// should be able to access `MyModel`
assez Facile?
2. @Testable (Swift 2 seulement)
cette approche repose sur le @testable
mot-clé introduit dans Swift 2.
dans votre cible app:
import RealmSwift
internal class MyModel: Object {} // ACL cannot be `private`
encore une fois, ce code devrait être compilé dans le cadre de votre cible d'application, et vos tests unitaires peuvent être configurés de la manière suivante:
@testable import MyApp
// should be able to access `MyModel`
assurez-vous que les paramètres de construction de MyApp ont Enable Testability
YES
.
cette approche peut être préférée aux modèles publics si vous construisez un cadre où certains modèles internes ne devraient pas être accessibles par les utilisateurs de ce cadre.
Realm a une section dédiée de leur documentation détaillant ces approches communes pour les tests que vous pouvez lire ici: https://realm.io/docs/swift/latest/#avoid-linking-realm-and-tested-code-in-test-targets
j'ai dû arrêter de cibler toutes mes applications .les fichiers swift doivent être membres de MyAppTests, et compter uniquement sur @testable import MyApp
j'ai aussi eu cette erreur récemment et aucune des étapes ci-dessus n'a corrigé le problème, ce qui a été corrigé c'était de supprimer le fichier non-swift de compiler sources build phase dans la cible sur laquelle vous voulez faire des tests. Cela a échoué silencieusement
tout d'abord, assurez-vous que @testable import MyApp
est inclus dans chaque fichier de test. Ensuite, dans les Phases de construction de votre cible de test, supprimez tous les fichiers non-test des sections ressources du paquet de copies. Les fichiers App qui sont dans votre cible de test qui pointent vers des fichiers app qui ne sont pas dans votre cible de test cassent vos tests unitaires. Supprimez tous les fichiers app de votre cible de test et ajoutez 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 étaient liés à la cible de test de l'unité, et donc compilés deux fois!
aussi, j'ai installé Realm via Carthage et j'ai dû inclure les deux cibles (main et test) pour le "Realm".framework " et " RealmSwift.cadre" parce que cela ne marcherait pas autrement.
Voici la question du lien