1. ホーム
  2. cocoa

[解決済み】ユニットテスト内のコードでバンドルリソースを見つけられないのはなぜですか?

2022-04-16 10:07:39

質問

私がユニットテストしているいくつかのコードは、リソースファイルをロードする必要があります。それは次の行を含んでいます。

NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];

アプリ内では問題なく動作していますが、ユニットテストフレームワークで実行すると pathForResource: はnilを返します。 foo.txt .

を確認しました。 foo.txt が含まれます。 コピーバンドルリソース ユニットテストターゲットのビルドフェーズで、なぜファイルが見つからないのでしょうか?

解決方法は?

ユニットテストハーネスがあなたのコードを実行するとき、あなたのユニットテストバンドルは NOT メインバンドル

アプリケーションではなく、テストを実行している場合でも、アプリケーションバンドルはメインバンドルとなります。(おそらく、これはテストしているコードが間違ったバンドルを検索するのを防ぐためでしょう)。したがって、ユニットテストバンドルにリソースファイルを追加しても、メインバンドルで検索すると見つからないでしょう。上の行を次のように置き換えると

NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *path = [bundle pathForResource:@"foo" ofType:@"txt"];

そうすれば、あなたのコードはユニットテスト・クラスが含まれるバンドルを検索し、すべてがうまくいくでしょう。