アプリケーションのユニットテストでプロジェクト中のXMLファイルを読込む

ユニットテスト単体テストではテストの入力としてXMLファイルやテキストファイルを読みたいことがあるだろう。

Xcodeでプロジェクトに追加したXMLファイルをテストケースで読込んでXMLパーサに渡す処理だが、最初は以下のコードを書いていた。

NSURL* url = [NSURL fileURLWithPath:@"./testsProject/testdto.xml"];
NSData* data = [NSData dataWithContentsOfURL:url];
NSXMLParser* parser = [[NSXMLParser alloc] initWithData:data];

テスト時のカレントディレクトリはプロジェクトのルートなので、そこからの相対パスを指定してやるのが一番良いと思っていたのだが、このコード、実機では動かないのは勿論だが、Xcode上でも動く場合と動かない場合があるのだ。

色々試した所、GUIを全く使わないライブラリィの単体テストだと問題無く動くのだが、アプリケーションとして作成したプロジェクトの場合、相対パスからのURLが正しく生成されない。やはりシステムのファイルシステムを使うのは駄目のようだ。

アプリケーションを起動した状態でのテストも考慮するとやはりビルドしたアプリケーションパッケージのバンドルにXMLを埋め込んでおき、それをテスト時にロードする必要がある。

アプリケーションのバンドルからXMLをロードしてXMLパーサに渡す処理は以下のようになるだろう。

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

これだとどんな状態でもXMLファイルのロードは成功するだろう。

なお、この方法を使う場合アプリケーションパッケージのバンドルにXMLファイルを含める必要がある。
この際アプリケーションプロジェクト中、例えばresourcesグループにXMLファイルを追加するとバンドルに自動的に追加されるが、ここで注意すべきは、テスト用のバンドルというものは無く、あくまでアプリケーションのバンドルにXMLを追加する必要があるということ。

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