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/DerivedDataetwa ...
/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 testein MyProjectPackageTests.xctestTestpaket. Und das swift package generate-xcodeprojwird ein MyProjectTests.xctestTestpaket 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 .bundlePathund .bundleURLden 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 buildundswift 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"]
),
]
)