Une implémentation Swift:
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)
Bundle fournit des moyens de découvrir les chemins principaux et de test de votre configuration:
@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
Dans Xcode 6 | 7 | 8 | 9, un chemin de bundle de test unitaire sera dans Developer/Xcode/DerivedData
quelque chose comme ...
/Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
foo.txt
... qui est distinct du Developer/CoreSimulator/Devices
chemin du bundle régulier (non-test unitaire) :
/Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
Notez également que l'exécutable du test unitaire est, par défaut, lié au code de l'application. Cependant, le code de test unitaire ne doit avoir l'appartenance cible que dans l'ensemble de test. Le code d'application ne doit avoir l'appartenance cible que dans l'ensemble d'applications. Lors de l'exécution, le bundle cible de test unitaire est injecté dans le bundle d'application pour exécution .
Gestionnaire de paquets Swift (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
Remarque: Par défaut, la ligne de commande swift test
créera un MyProjectPackageTests.xctest
ensemble de test. Et, le swift package generate-xcodeproj
créera un MyProjectTests.xctest
bundle de test. Ces différents lots de tests ont des chemins différents . En outre, les différents ensembles de tests peuvent présenter des différences de structure de répertoire interne et de contenu .
Dans les deux cas, .bundlePath
et .bundleURL
renverra le chemin du bundle de test en cours d'exécution sur macOS. Cependant, Bundle
n'est actuellement pas implémenté pour Ubuntu Linux.
En outre, la ligne de commande swift build
et swift test
ne fournissent actuellement pas de mécanisme de copie des ressources.
Cependant, avec un peu d'effort, il est possible de configurer des processus pour utiliser Swift Package Manager avec des ressources dans les environnements de ligne de commande macOS Xcode, macOS et Ubuntu. Un exemple peut être trouvé ici: 004.4'2 SW Dev Swift Package Manager (SPM) With Resources Qref
Voir aussi: Utiliser des ressources dans des tests unitaires avec Swift Package Manager
Gestionnaire de paquets Swift (SPM) 4.2
Swift Package Manager PackageDescription 4.2 introduit la prise en charge des dépendances locales .
Les dépendances locales sont des packages sur disque qui peuvent être référencés directement en utilisant leurs chemins. Les dépendances locales ne sont autorisées que dans le package racine et elles remplacent toutes les dépendances portant le même nom dans le graphique du package.
Remarque: je m'attends, mais je n'ai pas encore testé, que quelque chose comme ce qui suit devrait être possible avec 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"]
),
]
)