7

単体テストのターゲットは、一部のテストで使用する画像リソースを読み込む必要がありますが、読み込みに問題があります。

  1. テスト ターゲット内にアセット カタログを作成しました。
  2. 新しい画像セットリソースをカタログに追加し、[デバイス] の [Mac] ボックスをオンにして、そのソース画像を両方の解像度 (@1x と @2x) に設定しました。

ここに画像の説明を入力

  1. テスト ターゲットの「バンドル リソースのコピー」ビルド フェーズを確認しましたが、アセット カタログが含まれています。

  2. アセット カタログとイメージ セットのターゲット メンバーシップを確認しましたが、実際にテスト ターゲットです。


テストを実行するとき、以下のようなコードを使用して画像を読み込もうとしています:

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に、私は推測します。

問題は、イメージをロードするバンドルを指定できる'sに似たイニシャライザNSImageがないことです(2 番目の引数)。UIImageinit(named:in:compatibleWith:)

代わりに、特定のバンドル ( 以外main) にリソース URL を作成し、そこからイメージをインスタンス化するように依頼することもできます (上記のように) が、これはアセット カタログと互換性がないようです。詳細情報は大歓迎です...

4

1 に答える 1