Tech Racho エンジニアの「?」を「!」に。
  • 開発

[Xcode 4] テストケースで、外部のデータファイルを使う

Mac / iOSのテストケースを書いていて、外部のデータファイル(XML等)をテストケースから参照したい場合があると思います。
実際のアプリケーションの場合、Targetに登録されたファイルがバンドル内に存在するため、

NSString* path = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"xml"];
NSData* data = [NSData dataWithContentsOfFile:path];

とすることで、データファイルの中身を取得可能ですが、
テストケースの場合そもそもバンドルが存在しないため、NSBundleからはパスが取れません。
フルパス指定するという方法もありますが、他の環境で動かなくなるため現実的ではありません。
そこで、相対指定をするわけですが、
相対指定をするためには、カレントパスが一体どこかを知る必要があります。
ぱっと探したところ、載ってるページがすぐには見つからなかったため、ログを出して調べてみました。
以下のコードで、カレントパスがわかります。

NSLog(@"Current Directory:%@", [[NSFileManager defaultManager] currentDirectoryPath]);

結果、テストの実行時のカレントパスは、プロジェクトファイル(.xcodeproj)が存在するディレクトリであることがわかりました。
そのため以下のように、プロジェクトファイルが存在するディレクトリを基準として、相対パスでファイルを指定することで、
外部ファイルのデータを取得できました。
この際、「dataWithContentOfFile」で直接相対パスを入れると相対パスを展開してくれないため、
一旦NSURLを生成して、「dataWithContentsOfURL」を使うこともポイントです。

NSURL* URL = [NSURL fileURLWithPath:@"./AppTests/example.xml"];
NSData* data = [NSData dataWithContentsOfURL:URL];

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。