来自测试目标

时间:2018-03-22 05:50:06

标签: macos nsimage asset-catalog xctestcase

我的单元测试目标需要加载一个图像资源以供在某些测试中使用,但是我在加载它时遇到了问题。

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

    enter image description here

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

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

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

      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并从中实例化图像(就像我上面所做的那样),但这与它看起来的资产目录不兼容。 欢迎提供更多信息......

1 个答案:

答案 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上进行了测试。