我的单元测试目标需要加载一个图像资源以供在某些测试中使用,但是我在加载它时遇到了问题。
我已经检查了测试目标的“复制包资源”构建阶段,它确实包含了资产目录。
我检查了资产目录和图像集的目标成员资格,它确实是测试目标。
运行测试时,我尝试使用如下代码加载图像:
guard let image = NSImage(named: NSImage.Name("TestSourceImage")) else {
fatalError("Test Resource is Missing.")
}
......但守卫失败了。
我也尝试过:
let bundle = Bundle(for: MyClassTests.self)
guard let path = bundle.pathForImageResource(NSImage.Name("TestSourceImage")) else {
fatalError("Test Resource is Missing.")
}
guard let image = NSImage(contentsOfFile: path) else {
fatalError("Test Resource File is Corrupt.")
}
...但是第一个警卫失败了(无法检索资源路径)。
我尝试了两种格式
NSImage.Name("TestSourceImage")
和
NSImage.Name(rawValue: "TestSourceImage")
我也试过Bundle.urlForImageResource(_)
,但也失败了。
我见过类似的问题和答案,但它们要么适用于 iOS ,要么适用于 app (主要)捆绑包中的资源。
我缺少什么?
更新
在意外,我通过将我的测试图像添加为独立的图像资源(不使用资产目录)并加载它来解决问题使用以下代码:
let bundle = Bundle(for: MyClassTests.self)
guard let url = bundle.url(forResource: "TestSourceImage", withExtension: "png") else {
fatalError("!!!")
}
guard let image = NSImage(contentsOf: url) else {
fatalError("!!!")
}
在这种情况下我不需要支持多种分辨率(我的图像是图像处理算法的来源;它已经被认为是必要的最高分辨率),而且我做了,我只是从 .png 到 .tiff ,我猜。
问题似乎是,NSImage
不的初始值设定项与UIImage
的{{1}}类似,可让您指定 bundle 从中加载图像(第二个参数)。
您可以改为询问特定的包(init(named:in:compatibleWith:)
除外)来创建资源URL并从中实例化图像(就像我上面所做的那样),但这与它看起来的资产目录不兼容。 欢迎提供更多信息......
答案 0 :(得分:5)
Bundle上有一个扩展,可以从资产目录中加载命名图像:
extension Bundle {
@available(OSX 10.7, *)
open func image(forResource name: NSImage.Name) -> NSImage?
}
以您的示例为例,您可以在XCTestCase中使用以下内容访问图像(Swift 5):
guard let image = Bundle(for: type(of: self)).image(forResource: "TestSourceImage") else {
fatalError("Test Resource is Missing.")
}
在macOS 10.14上进行了测试。