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?

18
demandé sur Community 2015-08-28 17:55:09

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 TestabilityYES.

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

20
répondu jpsim 2015-08-28 17:50:04

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

9
répondu styler1972 2015-08-28 20:19:44

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

enter image description here

0
répondu amleszk 2016-01-08 15:30:05

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!

0
répondu Ben Fox 2016-05-19 21:49:23

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

https://github.com/realm/realm-cocoa/issues/3627

0
répondu Pavle Mijatovic 2016-05-24 07:59:15