Einige Codes, die ich Unit-Tests mache, müssen eine Ressourcendatei laden. Es enthält die folgende Zeile:
NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
In der App läuft es einwandfrei, aber wenn es vom Unit-Test-Framework ausgeführt wird, wird pathForResource:
null zurückgegeben, was bedeutet, dass es nicht gefunden werden konnte foo.txt
.
Ich habe sichergestellt, dass dies foo.txt
in der Erstellungsphase " Copy Bundle Resources" des Unit-Test-Ziels enthalten ist. Warum kann es die Datei nicht finden?
self
bezieht sie sich auf eine Klasse im Hauptpaket , nicht auf die Testfallklasse. Ersetzen Sie[self class]
durch eine beliebige Klasse in Ihrem Hauptpaket. Ich werde mein Beispiel bearbeiten.bundleForClass:
mit einer Klasse im Unit-Test-Bundle verwenden. Sie sollten den Pfad der Datei in Ihrem Unit-Test-Code abrufen und dann die Pfadzeichenfolge an Ihren anderen Code weitergeben.Eine schnelle Implementierung:
Swift 2
Swift 3, Swift 4
Das Bundle bietet Möglichkeiten, die Haupt- und Testpfade für Ihre Konfiguration zu ermitteln:
In Xcode 6 | 7 | 8 | 9 befindet sich ein Unit-Test-Bundle-Pfad in
Developer/Xcode/DerivedData
etwa ...... die vom
Developer/CoreSimulator/Devices
regulären Bundle-Pfad (ohne Unit-Test) getrennt ist :Beachten Sie auch, dass die ausführbare Unit-Test-Datei standardmäßig mit dem Anwendungscode verknüpft ist. Der Komponententestcode sollte jedoch nur im Testpaket eine Zielmitgliedschaft enthalten. Der Anwendungscode sollte nur eine Zielmitgliedschaft im Anwendungspaket enthalten. Zur Laufzeit wird das Unit-Test- Zielpaket zur Ausführung in das Anwendungspaket eingefügt .
Swift Package Manager (SPM) 4:
Hinweis: Standardmäßig erstellt die Befehlszeile
swift test
einMyProjectPackageTests.xctest
Testpaket. Und dasswift package generate-xcodeproj
wird einMyProjectTests.xctest
Testpaket erstellen . Diese verschiedenen Testpakete haben unterschiedliche Pfade . Außerdem können die verschiedenen Testpakete einige interne Verzeichnisstrukturen und Inhaltsunterschiede aufweisen .In beiden Fällen gibt das
.bundlePath
und.bundleURL
den Pfad des Testpakets zurück, das derzeit unter macOS ausgeführt wird. Jedoch,Bundle
derzeit jedoch nicht für Ubuntu Linux implementiert.Auch Kommandozeile
swift build
undswift test
bieten derzeit keinen Mechanismus zum Kopieren von Ressourcen.Mit einigem Aufwand ist es jedoch möglich, Prozesse für die Verwendung des Swift Package Managers mit Ressourcen in den Befehlszeilenumgebungen macOS Xcode, macOS command line und Ubuntu einzurichten. Ein Beispiel finden Sie hier: 004.4'2 SW Dev Swift Package Manager (SPM) mit Ressourcen Qref
Siehe auch: Verwenden Sie Ressourcen in Komponententests mit Swift Package Manager
Swift Package Manager (SPM) 4.2
Swift Package Manager PackageDescription 4.2 bietet Unterstützung für lokale Abhängigkeiten .
Hinweis: Ich erwarte, habe aber noch nicht getestet, dass mit SPM 4.2 Folgendes möglich sein sollte:
quelle
Bei Swift 3 ist die Syntax
self.dynamicType
veraltet. Verwenden Sie stattdessen dieseoder
quelle
Bestätigen Sie, dass die Ressource zum Testziel hinzugefügt wurde.
quelle
Wenn Ihr Projekt mehrere Ziele enthält, müssen Sie Ressourcen zwischen verschiedenen Zielen hinzufügen, die in der Zielmitgliedschaft verfügbar sind, und Sie müssen möglicherweise in drei Schritten zwischen verschiedenen Zielen wechseln ( siehe Abbildung unten)
quelle
Ich musste sicherstellen, dass dieses Kontrollkästchen Allgemeine Tests aktiviert war
quelle