Swift 5.3
Hinweis: Swift 5.3 enthält Funktionen für Paketmanagerressourcen SE-0271 , die mit Ressourcen für Anwendungspakete und Testpakete verwendet werden können.
Ressourcen sind nicht immer für die Verwendung durch Kunden des Pakets vorgesehen. Eine Verwendung von Ressourcen kann Testvorrichtungen umfassen, die nur für Komponententests benötigt werden. Solche Ressourcen würden nicht zusammen mit dem Bibliothekscode in Clients des Pakets integriert, sondern nur während der Ausführung der Pakettests verwendet.
Swift 4, 5:
let testBundle = Bundle(for: type(of: self))
guard let fileURL = testBundle.url(forResource: "imageName", withExtension: "png")
else { fatalError() }
guard let filePath = bundle.path(forResource: "dataName", ofType: "csv")
else { fatalError() }
let fileUrl = URL(fileURLWithPath: filePath)
Das Bundle bietet Möglichkeiten, die Haupt- und Testpfade für Ihre Konfiguration zu ermitteln:
@testable
import Example
class ExampleTests: XCTestCase {
func testExample() {
let bundleMain = Bundle.main
let bundleDoingTest = Bundle(for: type(of: self ))
let bundleBeingTested = Bundle(identifier: "com.example.Example")!
print("bundleMain.bundlePath : \(bundleMain.bundlePath)")
print("bundleDoingTest.bundlePath : \(bundleDoingTest.bundlePath)")
print("bundleBeingTested.bundlePath : \(bundleBeingTested.bundlePath)")
print("bundleMain = " + bundleMain.description)
print("bundleDoingTest = " + bundleDoingTest.description)
print("bundleUnderTest = " + bundleBeingTested.description)
Die Xcode-URL befindet sich in Developer/Xcode/DerivedData
etwa ...
file:
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
imageName.png
... die von der Developer/CoreSimulator/Devices
URL getrennt ist
file:
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
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:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
Hinweis: Standardmäßig erstellt die Befehlszeile swift test
ein MyProjectPackageTests.xctest
Testpaket. Und das swift package generate-xcodeproj
wird ein MyProjectTests.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 Testbündels zurück, das derzeit unter macOS ausgeführt wird. Ist Bundle
derzeit jedoch nicht für Ubuntu implementiert.
Befehlszeile swift build
und swift 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