来自测试目标中资产目录的 NSImage

Nic*_*ari 7 macos nsimage asset-catalog xctestcase

我的单元测试目标需要加载用于某些测试的图像资源,但我无法加载它。

  1. 我在测试目标中创建了一个资产目录
  2. 我在目录中添加了一个新的图像集资源,选中了“设备”中的“Mac”框,并将其源图像设置为两种分辨率(@1x 和 @2x):

在此处输入图片说明

  1. 我已经检查了测试目标的“复制捆绑资源”构建阶段,它确实包含资产目录。

  2. 我检查了资产目录和图像集的目标成员资格,确实是测试目标。


运行测试时,我尝试使用如下代码加载图像:

guard let image = NSImage(named: NSImage.Name("TestSourceImage")) else {
    fatalError("Test Resource is Missing.")
}
Run Code Online (Sandbox Code Playgroud)

...但守卫失败了。

我也试过:

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.")
}
Run Code Online (Sandbox Code Playgroud)

...但第一个守卫失败(无法检索资源路径)。

两种格式我都试过了

NSImage.Name("TestSourceImage")
Run Code Online (Sandbox Code Playgroud)

和:

NSImage.Name(rawValue: "TestSourceImage")
Run Code Online (Sandbox Code Playgroud)

我也试过Bundle.urlForImageResource(_),但它也失败了。


我见过类似的问题和答案,但它们适用于iOS应用程序(主)包中的资源。

我错过了什么?


更新:

在meantine,我身边工作过的问题,加入我的测试图像作为独立的图像资源(使用的资产目录),并用下面的代码加载它:

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("!!!")
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下我不需要支持多种分辨率(我的图像是图像处理算法的来源;它已经被假定为所需的最高分辨率),即使我支持,我也会从.png切换到.tiff,我猜。

这个问题似乎是,NSImage不会有一个初始化类似UIImageinit(named:in:compatibleWith:),它可以让你指定从中加载图像(第二个参数)。

您可以改为要求特定包(除了main)创建资源 URL 并从中实例化图像(就像我上面所做的那样),但这似乎与资产目录不兼容。欢迎提供更多信息...

Dr.*_* F. 5

Bundle 上有一个扩展,允许从资产目录加载命名图像:

extension Bundle {
    @available(OSX 10.7, *)
    open func image(forResource name: NSImage.Name) -> NSImage?
}
Run Code Online (Sandbox Code Playgroud)

参考您的示例,您可以在 XCTestCase 中使用以下内容来访问图像(Swift 5):

guard let image = Bundle(for: type(of: self)).image(forResource: "TestSourceImage") else {
    fatalError("Test Resource is Missing.")
}
Run Code Online (Sandbox Code Playgroud)

在 macOS 10.14 上测试。