Un'implementazione rapida:
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)
Il pacchetto fornisce modi per scoprire i percorsi principali e di test per la tua configurazione:
@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, un percorso di bundle di unit test sarà in Developer/Xcode/DerivedData
qualcosa come ...
/Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
foo.txt
... che è separato dal Developer/CoreSimulator/Devices
normale percorso del bundle (non unit-test) :
/Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
Si noti inoltre che l'eseguibile di unit test è, per impostazione predefinita, collegato al codice dell'applicazione. Tuttavia, il codice test unitario deve avere solo l'appartenenza target solo nel pacchetto test. Il codice dell'applicazione deve avere solo l'appartenenza target nel pacchetto dell'applicazione. In fase di esecuzione, il bundle target unit test viene iniettato nel bundle dell'applicazione per l'esecuzione .
Swift Package Manager (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
Nota: per impostazione predefinita, la riga di comando swift test
creerà un MyProjectPackageTests.xctest
pacchetto di test. E, swift package generate-xcodeproj
creerà un MyProjectTests.xctest
pacchetto di test. Questi diversi bundle di test hanno percorsi diversi . Inoltre, i diversi bundle di test potrebbero presentare una struttura di directory interna e differenze di contenuto .
In entrambi i casi, .bundlePath
e .bundleURL
restituirà il percorso del bundle di test attualmente in esecuzione su macOS. Tuttavia, Bundle
non è attualmente implementato per Ubuntu Linux.
Inoltre, la riga di comando swift build
e al swift test
momento non fornisce un meccanismo per la copia delle risorse.
Tuttavia, con un certo sforzo, è possibile impostare processi per utilizzare Swift Package Manger con risorse negli ambienti macOS Xcode, riga di comando macOS e riga di comando Ubuntu. Un esempio è disponibile qui: 004.4'2 SW Dev Swift Package Manager (SPM) con risorse Qref
Vedi anche: Usa le risorse nei test unitari con Swift Package Manager
Swift Package Manager (SPM) 4.2
Swift Package Manager PackageDescription 4.2 introduce il supporto delle dipendenze locali .
Le dipendenze locali sono pacchetti su disco a cui è possibile fare riferimento direttamente utilizzando i loro percorsi. Le dipendenze locali sono consentite solo nel pacchetto radice e sovrascrivono tutte le dipendenze con lo stesso nome nel grafico del pacchetto.
Nota: mi aspetto, ma non ho ancora testato, che qualcosa di simile al seguente dovrebbe essere possibile con SPM 4.2:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "MyPackageTestResources",
dependencies: [
.package(path: "../test-resources"),
],
targets: [
// ...
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage", "MyPackageTestResources"]
),
]
)