Szybkie wdrożenie:
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)
Pakiet zapewnia sposoby odkrywania głównych i testowych ścieżek konfiguracji:
@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
W Xcode 6 | 7 | 8 | 9 ścieżka pakietu testów jednostkowych będzie Developer/Xcode/DerivedDatawyglądała jak ...
/Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
foo.txt
... który jest niezależny od Developer/CoreSimulator/Devices zwykłej ścieżki pakietu (nie w ramach testu jednostkowego) :
/Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
Należy również pamiętać, że plik wykonywalny testu jednostkowego jest domyślnie powiązany z kodem aplikacji. Jednak kod testu jednostkowego powinien mieć docelowe członkostwo tylko w pakiecie testowym. Kod aplikacji powinien mieć tylko docelowe członkostwo w pakiecie aplikacji. W czasie wykonywania pakiet docelowego testu jednostkowego jest wstrzykiwany do pakietu aplikacji w celu wykonania .
Swift Package Manager (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = \(testBundle.bundlePath) ")
Uwaga: Domyślnie wiersz poleceń swift testutworzy MyProjectPackageTests.xctestpakiet testowy. I swift package generate-xcodeprojstworzy MyProjectTests.xctestpakiet testowy. Te różne pakiety testowe mają różne ścieżki . Różne pakiety testowe mogą mieć także wewnętrzną strukturę katalogów i różnice w zawartości .
W obu przypadkach, .bundlePathi .bundleURLzwróci ścieżkę pakietu testowego obecnie uruchomionego na macOS. Jednak Bundlenie jest obecnie zaimplementowany dla Ubuntu Linux.
Ponadto wiersz polecenia swift buildi swift testobecnie nie zapewniają mechanizmu kopiowania zasobów.
Jednak przy pewnym wysiłku możliwe jest skonfigurowanie procesów do używania Swift Package Manger z zasobami w środowisku macOS Xcode, wierszu poleceń macOS i środowisku wiersza poleceń Ubuntu. Jeden przykład można znaleźć tutaj: 004.4'2 SW Dev Swift Package Manager (SPM) z zasobami Qref
Zobacz także: Używaj zasobów w testach jednostkowych za pomocą Swift Package Manager
Swift Package Manager (SPM) 4.2
Swift Package Manager PackageDescription 4.2 wprowadza obsługę lokalnych zależności .
Zależności lokalne to pakiety na dysku, do których można odwoływać się bezpośrednio przy użyciu ich ścieżek. Zależności lokalne są dozwolone tylko w pakiecie głównym i zastępują wszystkie zależności o tej samej nazwie na wykresie pakietu.
Uwaga: spodziewam się, ale jeszcze nie przetestowałem, że w SPM 4.2 powinno być możliwe coś takiego:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "MyPackageTestResources",
dependencies: [
.package(path: "../test-resources"),
],
targets: [
// ...
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage", "MyPackageTestResources"]
),
]
)