Реализация Swift:
Swift 2
let testBundle = NSBundle(forClass: self.dynamicType)
let fileURL = testBundle.URLForResource("imageName", withExtension: "png")
XCTAssertNotNil(fileURL)
Свифт 3, Свифт 4
let testBundle = Bundle(for: type(of: self))
let filePath = testBundle.path(forResource: "imageName", ofType: "png")
XCTAssertNotNil(filePath)
Bundle предоставляет способы обнаружения основных и тестовых путей для вашей конфигурации:
@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/
Также обратите внимание, что исполняемый файл модульного теста по умолчанию связан с кодом приложения. Однако код модульного теста должен иметь только целевое членство только в комплекте тестов. Код приложения должен иметь только целевое членство в комплекте приложений. Во время выполнения целевой пакет модульного теста вводится в пакет приложения для выполнения .
Swift Package Manager (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 с ресурсами в средах macOS Xcode, macOS и Ubuntu. Один пример можно найти здесь: 004.4'2 SW Dev Swift Package Manager (SPM) с ресурсами Qref
См. Также: Использование ресурсов в модульных тестах с Swift Package Manager.
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"]
),
]
)