Certains codes que je suis en test unitaire doivent charger un fichier de ressources. Il contient la ligne suivante:
NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
Dans l'application, il fonctionne très bien, mais lorsqu'il est exécuté par le cadre de test unitaire, il pathForResource:
renvoie nil, ce qui signifie qu'il n'a pas pu le localiser foo.txt
.
Je me suis assuré que cela foo.txt
était inclus dans la phase de création de Copy Bundle Resources de la cible de test unitaire, alors pourquoi ne trouve-t-il pas le fichier?
self
fait référence à une classe dans le bundle principal, pas à la classe de cas de test. Remplacez[self class]
par n'importe quelle classe de votre bundle principal. Je vais éditer mon exemple.bundleForClass:
avec une classe du bundle de tests unitaires. Vous devriez obtenir le chemin du fichier dans votre code de test unitaire, puis transmettre la chaîne de chemin à votre autre code.Une implémentation Swift:
Swift 2
Swift 3, Swift 4
Bundle fournit des moyens de découvrir les chemins principaux et de test de votre configuration:
Dans Xcode 6 | 7 | 8 | 9, un chemin de bundle de test unitaire sera dans
Developer/Xcode/DerivedData
quelque chose comme ...... qui est distinct du
Developer/CoreSimulator/Devices
chemin du bundle régulier (non-test unitaire) :Notez également que l'exécutable du test unitaire est, par défaut, lié au code de l'application. Cependant, le code de test unitaire ne doit avoir l'appartenance cible que dans l'ensemble de test. Le code d'application ne doit avoir l'appartenance cible que dans l'ensemble d'applications. Lors de l'exécution, le bundle cible de test unitaire est injecté dans le bundle d'application pour exécution .
Gestionnaire de paquets Swift (SPM) 4:
Remarque: Par défaut, la ligne de commande
swift test
créera unMyProjectPackageTests.xctest
ensemble de test. Et, leswift package generate-xcodeproj
créera unMyProjectTests.xctest
bundle de test. Ces différents lots de tests ont des chemins différents . En outre, les différents ensembles de tests peuvent présenter des différences de structure de répertoire interne et de contenu .Dans les deux cas,
.bundlePath
et.bundleURL
renverra le chemin du bundle de test en cours d'exécution sur macOS. Cependant,Bundle
n'est actuellement pas implémenté pour Ubuntu Linux.En outre, la ligne de commande
swift build
etswift test
ne fournissent actuellement pas de mécanisme de copie des ressources.Cependant, avec un peu d'effort, il est possible de configurer des processus pour utiliser Swift Package Manager avec des ressources dans les environnements de ligne de commande macOS Xcode, macOS et Ubuntu. Un exemple peut être trouvé ici: 004.4'2 SW Dev Swift Package Manager (SPM) With Resources Qref
Voir aussi: Utiliser des ressources dans des tests unitaires avec Swift Package Manager
Gestionnaire de paquets Swift (SPM) 4.2
Swift Package Manager PackageDescription 4.2 introduit la prise en charge des dépendances locales .
Remarque: je m'attends, mais je n'ai pas encore testé, que quelque chose comme ce qui suit devrait être possible avec SPM 4.2:
la source
Avec Swift Swift 3, la syntaxe
self.dynamicType
est obsolète, utilisez-la à la placeou
la source
Confirmez que la ressource est ajoutée à la cible de test.
la source
si vous avez plusieurs cibles dans votre projet, vous devez ajouter des ressources entre différentes cibles disponibles dans l' appartenance cible et vous devrez peut-être basculer entre différentes cibles en 3 étapes illustrées dans la figure ci-dessous
la source
Je devais m'assurer que cette case à cocher Test général était activée
la source