Eine schnelle Implementierung:
Swift 2
let testBundle = NSBundle(forClass: self.dynamicType)
let fileURL = testBundle.URLForResource("imageName", withExtension: "png")
XCTAssertNotNil(fileURL)
Swift 3, Swift 4
let testBundle = Bundle(for: type(of: self))
let filePath = testBundle.path(forResource: "imageName", ofType: "png")
XCTAssertNotNil(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)")
// …/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Agents
print("bundleDoingTest.bundlePath : \(bundleDoingTest.bundlePath)")
// …/PATH/TO/Debug/ExampleTests.xctest
print("bundleBeingTested.bundlePath : \(bundleBeingTested.bundlePath)")
// …/PATH/TO/Debug/Example.app
print("bundleMain = " + bundleMain.description) // Xcode Test Agent
print("bundleDoingTest = " + bundleDoingTest.description) // Test Case Bundle
print("bundleUnderTest = " + bundleBeingTested.description) // App Bundle
In Xcode 6 | 7 | 8 | 9 befindet sich ein Unit-Test-Bundle-Pfad in Developer/Xcode/DerivedData
etwa ...
/Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
foo.txt
... die vom Developer/CoreSimulator/Devices
regulären Bundle-Pfad (ohne Unit-Test) getrennt ist :
/Users/
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 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 .
Lokale Abhängigkeiten sind Pakete auf der Festplatte, auf die über ihre Pfade direkt verwiesen werden kann. Lokale Abhängigkeiten sind nur im Stammpaket zulässig und überschreiben alle gleichnamigen Abhängigkeiten im Paketdiagramm.
Hinweis: Ich erwarte, habe aber noch nicht getestet, dass mit SPM 4.2 Folgendes möglich sein sollte:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "MyPackageTestResources",
dependencies: [
.package(path: "../test-resources"),
],
targets: [
// ...
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage", "MyPackageTestResources"]
),
]
)