Швидка реалізація:
Швидкий 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)
Комплект надає способи виявлення основних та тестових шляхів для вашої конфігурації:
@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
У Xcode 6 | 7 | 8 | 9 шлях конвертації одиничного тесту буде мати Developer/Xcode/DerivedData
щось на зразок ...
/Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
foo.txt
... що є окремим від Developer/CoreSimulator/Devices
звичайного (не тестового) шляху входу :
/Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
Також зауважте, що виконуваний модульний тест за замовчуванням пов'язаний з кодом програми. Однак код одиничного тесту повинен мати лише цільове членство лише у тестовому пакеті. Код програми повинен містити лише цільове членство в комплекті програми. Під час виконання одиничний цільовий цільовий пакет вводиться в пакет додатка для виконання .
Швидкий менеджер пакетів (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
Примітка. За замовчуванням командний рядок swift test
створить MyProjectPackageTests.xctest
тестовий пакет. І, swift package generate-xcodeproj
буде створити MyProjectTests.xctest
тестовий пакет. Ці різні тестові групи мають різні шляхи . Крім того, різні тестові групи можуть мати певну внутрішню структуру каталогів та різницю вмісту .
В будь-якому випадку, .bundlePath
і .bundleURL
поверне шлях тестового набору, який зараз виконується на macOS. Однак Bundle
наразі не використовується для Ubuntu Linux.
Також командний рядок swift build
і в swift test
даний час не надають механізм копіювання ресурсів.
Однак, доклавши певних зусиль, можна налаштувати процеси використання управління Swift Package з ресурсами в середовищах macOS Xcode, командним рядком macOS та командним рядком Ubuntu. Один приклад можна знайти тут: 004.4'2 SW Dev Swift Package Manager (SPM) With Resources Qref
Дивіться також: Використовуйте ресурси в одиничних тестах з Swift Package Manager
Швидкий менеджер пакетів (SPM) 4.2
Swift Package Manager PackageDescription 4.2 представляє підтримку локальних залежностей .
Локальні залежності - це пакети на диску, на які можна безпосередньо звернутися, використовуючи свої шляхи. Локальні залежності дозволені лише в кореневому пакеті, і вони перекривають усі залежності з тим самим іменем на графіку пакета.
Примітка: Я очікую, але ще не перевірив, що щось подібне до цього має бути можливим із 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"]
),
]
)