NSURL de chemin d'accès au fichier dans l'essai bundle avec XCTest
Je suis en train d'écrire une application iOS à l'aide de TDD et le nouveau XCTest cadre. Une de mes méthodes permet de retrouver un fichier à partir d'internet (étant donné un NSURL objet) et les stocke dans les documents de l'utilisateur. La signature de la méthode est similaire à:
- (void) fetchAndStoreImage:(NSURL *)imageUrl
Je suis en train d'écrire le test de cette méthode d'une manière qu'elle n'échoue pas si il n'y a pas de connexion à internet. Mon approche (prises à partir d'un précédent question) est l'appel de la méthode à l'aide d'un NSURL à une image dans le système de fichiers local.
Quand un nouveau projet avec les tests unitaires activé est créé, le répertoire Tests a un sous-répertoire nommé 'Fichiers'. Je suppose que c'est là que mes images de test devrait aller. Ma question est comment puis-je obtenir un NSURL objet qui pointe vers une image dans ce répertoire, que je ne veux pas d'images de test pour être intégrés à l'application. Toute aide est appréciée.
- Cette réponse résout ce problème sans changer le code stackoverflow.com/a/24330617/468868
Vous devez vous connecter pour publier un commentaire.
En fait, la
[NSBundle mainBundle]
lors de l'exécution d'un UnitTest est pas le chemin de votre application, mais est /Développeur/usr/bin, donc cela ne fonctionnera pas.La façon d'obtenir des ressources dans une unité de test est ici: OCUnit & NSBundle
En bref, l'utilisation:
ou dans votre cas:
NSBundle(forClass: self.dynamicType)
Swift 4, 5:
Bundle fournit des façons de découvrir le principal et tester les chemins d'accès de votre configuration:
Xcode URL sera en
Developer/Xcode/DerivedData
quelque chose comme ...... qui est distinct de
Developer/CoreSimulator/Devices
URLÉgalement note de l'unité de test exécutable est, par défaut, en lien avec le code de l'application. Toutefois, le code de test unitaire ne devrait avoir que des Cibles d'Adhésion dans tout le test bundle. Le code de l'application ne devrait avoir que des Cibles d'Adhésion dans le bundle de l'application. Au moment de l'exécution, l'unité de test cible bundle est injecté dans le bundle de l'application pour l'exécution.
Swift Gestionnaire de Package (SPM) 4:
Remarque: Par défaut, la ligne de commande
swift test
permettra de créer unMyProjectPackageTests.xctest
test bundle. Et, leswift package generate-xcodeproj
permettra de créer unMyProjectTests.xctest
test bundle. Ces différents tester les faisceaux ont des chemins différents. Aussi, le test différents faisceaux peuvent avoir certains interne de la structure de répertoire et les différences de contenu.Dans les deux cas, la
.bundlePath
et.bundleURL
sera de retour le chemin de la grappe-test actuellement en cours d'exécution sur macOS. Cependant,Bundle
n'est pas actuellement mis en œuvre pour Ubuntu.Aussi, en ligne de commande
swift build
etswift test
ne fournissent pas actuellement de mécanisme pour copier des ressources.Cependant, avec un peu d'effort, il est possible de mettre en place des processus pour l'utilisation de la Swift Paquet de Crèche avec des ressources dans le macOS Xcode, macOS ligne de commande, et Ubuntu en ligne de commande environnements. Un exemple peut être trouvé ici: 004.4'2 SW Dev Swift Gestionnaire de Package (SPM) Avec des Ressources Qref
Swift Gestionnaire de Package (SPM) 4.2
Swift Gestionnaire de paquets PackageDescription 4.2 introduit la prise en charge de les dépendances locales.
Remarque: je pense, mais n'ai pas encore testé, que quelque chose comme ce qui suit devrait être possible avec SPM 4.2:
withExtension
. Thx.withType
serait pour retrouver un chemin d'accèspathForResource("imageName", ofType: "png")
au lieu d'une URL.class SomeCaseTests: XCTestCase {..}
. Et,.dynamicType
évalue à la valeur de l'exécution type de la classe. voir Dev Apple document et faites défiler jusqu'à Type Dynamique de l'Expression.self.dynamicType
sinon, j'obtiens un message d'erreur en essayant d'attraper le paquet. Êtes-vous sûr que vous pouvez juste nourrirNSBundle(forClass:)
self
?Juste pour ajouter à la réponse correcte, c'est un exemple de comment obtenir le chemin d'accès d'un fichier dans votre UnitTests/prise en charge des Fichiers:
C'est probablement ce qui sera utile pour quelqu'un.
D'accès vers le fichier local :
Vous pouvez faire de la programmation asynchrone d'accès et d'attendre la réponse à l'aide de : https://github.com/travisjeffery/TRVSMonitor
Si vous avez ajouté :
dataset1.json
dans la cible de test (2) :Swift
version basée sur accepté réponse:Le problème que j'ai été confronté à été le code de l'application a été la tentative d'accès au regroupement principal pour des choses comme bundleIdentifier et depuis le regroupement principal n'était pas mon projet de test d'unité, il serait de retour nul.
Un hack autour de ce qui fonctionne dans les deux Swift 3.0.1 et Objective-C est de créer de l'Objectif de la catégorie C sur NSBundle et l'inclure dans votre projet de tests unitaires. Vous n'avez pas besoin d'un pontage en-tête ou quoi que ce soit. Cette catégorie seront chargées et maintenant, quand vous le code de l'application demande le regroupement principal de votre catégorie de retourner l'appareil de test bundle.
Voici la Swift version de ce, Xcode, 7, iOS 9, etc.
Note: someImage.jpg doivent être inclus dans votre cible de test.