// Get path to DefaultSettings.plist file.
let path = Bundle.module.path(forResource: "DefaultSettings", ofType: "plist")
// Load an image that can be in an asset archive in a bundle.
let image = UIImage(named: "MyIcon", in: Bundle.module, compatibleWith: UITraitCollection(userInterfaceStyle: .dark))
// Find a vertex function in a compiled Metal shader library.
let shader = try mtlDevice.makeDefaultLibrary(bundle: Bundle.module).makeFunction(name: "vertexShader")
// Load a texture.
let texture = MTKTextureLoader(device: mtlDevice).newTexture(name: "Grass", scaleFactor: 1.0, bundle: Bundle.module, options: options)
示例**
// swift-tools-version:5.3
import PackageDescription
targets: [
.target(
name: "CLIQuickstartLib",
dependencies: [],
resources: [
// Apply platform-specific rules.
// For example, images might be optimized per specific platform rule.
// If path is a directory, the rule is applied recursively.
// By default, a file will be copied if no rule applies.
.process("Resources"),
]),
.testTarget(
name: "CLIQuickstartLibTests",
dependencies: [],
resources: [
// Copy directories as-is.
// Use to retain directory structure.
// Will be at top level in bundle.
.copy("Resources"),
]),
8条答案
按热度按时间mnowg1ta1#
在swift Swift 3中,语法
self.dynamicType
已被弃用,请改用此语法或
mcdcgff02#
确认资源已添加到测试目标。
jchrr9hc3#
如果项目中有多个目标,则需要在目标成员资格中可用的不同目标之间添加资源,并且可能需要在不同的目标之间切换,如下图所示的3个步骤
ljsrvy3e4#
我必须确保将此“General Testing”复选框设置为
xtfmy6hx5#
只是对于像我这样的人来说,在最初的帖子中忽略了这一点:
确保foo.md包含在单元测试目标的复制捆绑资源构建阶段
lsmepo6l6#
有一个代码可以在以下位置找到文件:How to check if a file exists in the Documents directory in Swift?
我在下面的测试中使用了它,该测试测试我的文件是否已创建,并给出其位置以供进一步测试。
这不是测试文件是否在正确的位置创建,而是测试文件是否创建。
3mpgtkmj7#
当单元测试工具运行您的代码时,您的单元测试包是而不是主包。
即使您正在运行测试而不是应用程序,您的应用程序包仍然是主包。(据推测,这可以防止您正在测试的代码搜索错误的包。)因此,如果您将资源文件添加到单元测试包,则在搜索主包时将找不到它。如果您将上面的行替换为:
然后,您的代码将搜索单元测试类所在的包,一切都会很好。
busg9geu8#
Swift实施:
Bundle提供了发现配置的主路径和测试路径的方法:
在Xcode 6中|7|8|9,一个单元测试包路径将在
Developer/Xcode/DerivedData
中,类似于......它与
Developer/CoreSimulator/Devices
常规(非单元测试)绑定路径分开:注:默认情况下,命令行
swift test
将创建一个MyProjectPackageTests.xctest
测试包。而swift package generate-xcodeproj
将创建一个MyProjectTests.xctest
测试包。这些不同的测试包具有不同的路径。* 此外,不同的测试包可能具有某些内部目录结构和内容差异。*在任何一种情况下,
.bundlePath
和.bundleURL
都将返回当前在macOS上运行的测试包的路径。但是,Bundle
目前尚未在Ubuntu Linux上实现。此外,命令行
swift build
和swift test
当前不提供用于复制资源的机制。但是,通过一些努力,您可以在macOS Xcode、macOS命令行和Ubuntu命令行环境中设置使用Swift Package Manger的流程。004.4'2 SW Dev Swift Package Manager (SPM) With Resources Qref
另请参阅:使用Swift Package Manager在单元测试中使用资源
资源并不总是为包的客户端所使用;资源的一个用途可能包括仅单元测试需要的测试固定装置。这样的资源不会与库代码一起被合并到包的客户端中,而只会在运行包的测试时使用。
target
和testTarget
API中添加新的resources
参数,以允许显式声明资源文件。SwiftPM使用文件系统约定来确定属于软件包中每个目标的源文件集:具体来说,目标的源文件是那些位于为目标指定的"目标目录"下的文件。默认情况下,该目录与目标同名,位于"源"(对于常规目标)或"测试"(对于测试目标)中,但可以在包清单中定制该位置。
Bundle.module
由SwiftPM生成(参见Build/BuildPlan.swift SwiftTargetBuildDescription generateResourceAccessor()),因此在由Xcode构建时不存在于Foundation.Bundle中。*Xcode中的一种类似方法是手动将
Resources
引用文件夹添加到模块,添加Xcode构建阶段copy
以将Resource
放入某个*.bundle
目录,并添加#ifdef Xcode
编译器指令以使Xcode构建能够使用资源。