我的单元测试目标需要加载图像资源以用于某些测试,但我无法加载它。
- 我在测试目标中创建了一个资产目录。
- 我在目录中添加了一个新的图像集资源,选中了“设备”中的“Mac”框,并将其源图像设置为两种分辨率(@1x 和@2x):
我已经检查了测试目标的“复制捆绑资源”构建阶段,它确实包括资产目录。
我检查了资产目录和图像集的目标成员资格,它确实是测试目标。
运行测试时,我尝试使用如下代码加载图像:
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 ,要么适用于应用程序(主)包中的资源。
我错过了什么?
更新:
同时,我通过将测试图像添加为独立图像资源(不使用资产目录)并使用以下代码加载它来解决该问题:
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
没有类似于's的初始化程序,它允许您指定从中加载图像的包(第二个参数)。UIImage
init(named:in:compatibleWith:)
您可以改为要求特定的包(除了main
)来创建资源 URL 并从中实例化图像(就像我在上面所做的那样),但这似乎与资产目录不兼容。欢迎提供更多信息...