単体テストのターゲットは、一部のテストで使用する画像リソースを読み込む必要がありますが、読み込みに問題があります。
- テスト ターゲット内にアセット カタログを作成しました。
- 新しい画像セットリソースをカタログに追加し、[デバイス] の [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に、私は推測します。
問題は、イメージをロードするバンドルを指定できる'sに似たイニシャライザNSImage
がないことです(2 番目の引数)。UIImage
init(named:in:compatibleWith:)
代わりに、特定のバンドル ( 以外main
) にリソース URL を作成し、そこからイメージをインスタンス化するように依頼することもできます (上記のように) が、これはアセット カタログと互換性がないようです。詳細情報は大歓迎です...