2012-02-06 16 views
10

私はiOSアプリケーションの単体テストで単純なテキストファイルを読み込もうとしています。NSBundle pathForResourceがnilを返します

NSString* resourcePath = [[NSBundle mainBundle] pathForResource: @"stopPointsInCircleData" ofType:@"txt"]; 
NSString* stopPointData = [NSData dataWithContentsOfFile: resourcePath]; 

私の問題は、pathForResourceがnilを返すことです。

ファイルstopPointsInCircleData.txtはテストコードのディレクトリにあり、ファイルはテストターゲットのビルド段階の "バンドルリソースのコピー"に正しくリストされています。

ofTypeをofに設定して検索を緩和しようとしましたが、どちらも機能しませんでした。

どんな助けもあります。

+0

パスを手動で設定する方が簡単でしょうか? 'NSHomeDirectory()'は – Nekto

+0

を助けるでしょう。なぜならそれはtxtではないからです。あなたはファイル形式をチェックしましたか?それは何か他のものかもしれません..rtf? – Shubhank

答えて

27

問題は、ユニットテストのターゲットでは、-mainBundleがテストターゲットバンドルを参照するのではなく、テストターゲットがインジェクションされている実行可能ファイルのバンドルを参照するということです。 iosテストターゲットの場合、これはあなたのアプリケーションバンドルです。 Macのテストターゲットでは、アプリケーションバンドルまたはOCUnitランナーのいずれかになります。

テスト対象のバンドル内のリソースを探す必要があります。テストクラスの内部では、それは次のように行われています:

Project -> TestTarget -> Build Settings -> Unit Testing (Test Host)だけ挿入に

ジャストヘッド:

NSBundle *myBundle = [NSBundle bundleForClass: [self class]]; 
+0

'[self class]'は私にとってはうまくいかなかった。私は '[NAME_OF_TEST_CLASS class]'を置き換えなければなりませんでした。 –

+0

このようなコードをテストクラスの外側に置く必要があるなら、 '[NSBundle bundleForClass:NSClassFromString(@" MyTestClassName ")]' – CommaToast

5

それを達成するための簡単な方法がありますが、あなたはそのバンドルパスをエミュレートすることができ

$(BUILT_PRODUCTS_DIR)/AppName.app 

ハッピーテスト。

+1

を使うことができます。 –

関連する問題