web-dev-qa-db-fra.com

Tests unitaires de Swift 2.0, d'importation @testable et de ciblage de schémas

J'ai récemment converti mon application et mes tests unitaires vers Swift 2.0. J'utilise @testable import AppName dans mes fichiers Tests.Swift.

En raison d'un problème lié à l'impossibilité d'exécuter des sous-classes dans plusieurs cibles ( voir ici pour le problème ), ma classe EntityName ne peut être que de membre cible AppName et NOT AppNameTests.

Le problème est que, une fois que je passe au schéma AppNameTests pour exécuter des tests unitaires, le code dans le module AppName ne peut pas trouver la classe EntityName et je reçois

Utilisation du type non déclaré 'NomEntité'

Comment puis-je obtenir la compilation de AppName lors de l'exécution de tests à partir du schéma AppNameTests sans que cette classe d'entité ne soit pas membre du schéma?

18
styler1972

En raison d'un problème lié à l'impossibilité d'exécuter des sous-classes dans plusieurs cibles

Lors de la compilation du même code Swift dans le cadre de différentes cibles, le compilateur génère en fait différentes classes. Donc, cela se comporte comme prévu, mais ce n'est certainement pas ce que vous voulez lorsque vous exécutez les tests unitaires d'une application.

Je vous recommanderais de configurer vos modèles de manière à permettre les tests:

1. Modèles publics (recommandés)

Dans votre cible d'application:

import RealmSwift
public class MyModel: Object {}

Ce code doit uniquement ê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 uniquement)

Cette approche repose sur le mot clé @testable introduit dans Swift 2.

Dans votre cible d'application:

import RealmSwift
internal class MyModel: Object {} // ACL cannot be `private`

Encore une fois, ce code doit être seulement compilé avec la cible de votre 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 défini sur 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 aux utilisateurs de ce cadre.

Realm a une section dédiée de sa documentation détaillant ces approches communes de test que vous pouvez lire ici: https://realm.io/docs/Swift/latest/#avoid-linking-realm-and-tested-code-in -test-cibles

20
jpsim

Je devais arrêter de cibler toutes mes applications. Les fichiers Swift devaient appartenir à MyAppTests et ne reposer que sur @testable import MyApp.

9
styler1972

Tout d’abord, assurez-vous que @testable import MyApp est inclus dans chaque fichier de test. Ensuite, dans vos phases de construction de cible de test, supprimez tous les fichiers non testés des sections Copier les ressources du regroupement. Les fichiers d'application qui se trouvent dans votre cible de test et qui pointent vers des fichiers d'application qui ne se trouvent pas dans votre cible de test rompent vos tests unitaires. Supprimez tous les fichiers d'application de votre cible de test et ajoutez l'indicateur @testable. Tout devrait fonctionner!

0
Ben Fox

J'ai eu un problème similaire et le problème était que tous les fichiers source de l'application étaient liés à la cible de test unitaire, et donc compilés deux fois!

De plus, j'ai installé Realm via Carthage et je devais inclure les deux cibles (principale et test) pour les frameworks "Realm.framework" et "RealmSwift.framework" car cela ne fonctionnerait pas autrement.

Voici le lien de la question 

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

0
Pavle Mijatovic

J'ai également récemment eu cette erreur et aucune des étapes ci-dessus n'a résolu le problème. La suppression du fichier non-Swift de la phase de construction des sources Compile dans la cible sur laquelle vous souhaitez exécuter les tests a été résolue. Cela échouait silencieusement

 enter image description here

0
amleszk