ユニットテストでプロジェクト中のXMLファイルを読込む (解決)

デプロイ時には必要の無いファイルを、わざわざテストのためだけにアプリケーションのバンドルに追加しなくてはならないのは煩わしいので、なんとか良い方法が無いかなぁと思うのだが。

昨日はテスト時のバンドルにファイルは埋め込まれないと言ったが、それは嘘だ。

実際には、テストグループ下に追加されたXMLファイルは以下のパスに生成される拡張子.octestというパッケージにきちんとバンドルされるのだ。(iPhoneシミュレータでテストする場合)

/Users/kazz/Library/Developer/Xcode/DerivedData/プロダクト名-fiwdnpohxptoclfzjljknhgonkmg※/Build/Products/Debug-iphonesimulator/プロダクト名Tests.octest

このパッケージバンドルからtestdto.xmlを取り出してXMLパーサに渡すコードは以下のようになる。

NSBundle* bundle = [NSBundle bundleForClass:[self class]];
NSString* path = [bundle pathForResource:@"testdto" ofType:@"xml"];
NSURL* url = [NSURL fileURLWithPath:path]; 
NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:url];

NSBundleを取得するのにmainbundleではなく[self class](SenTestCaseのサブクラス)から生成されるバンドルを使うのがミソだ。

これでアプリケーションテスト時のみ使用するバンドルに埋め込んだXMLファイルをテストに使用することができる。

※fiwdnpohxptoclfzjljknhgonkmgはハッシングされた値で必ずこうなる訳では無い。