2009-07-07 12 views
26

私は、iPhone用の単体テストを書く際のAppleの文書に従っていましたが、そのまま使用できないようです。私は単体テストがアプリケーションデリゲートへの参照を取得する場所を理解していません。iPhone - 論理ユニットテスト用のリソースを取得する

私の依存関係は、次のようなものです: My_Program_target - > UnitTesting_target - > UnitTests_bundle

アサートに失敗したところ、次のコードスニペットです。私はCPPUNITにとても精通していますが、これがどのように交差するかを理解するのは難しいです。さらに

- (void) testAppDelegate { 

    id yourApplicationDelegate = [[UIApplication sharedApplication] delegate]; 
    STAssertNotNil(yourApplicationDelegate, @"UIAppliation failed to find the AppDelegate"); 

} 

:私はロジックテストを行うには、私のアプローチに決めました

。私はXMLファイルを読み込もうとしていますが、バンドルを解決できないので、ファイルにアクセスできるようになります。私は、allBundlesによって出力されたパスを貼り付けようとしましたが、そのパスは動作していないようです。以下は、(あなたは私が出力にバンドルのパスを使用していデバッグ文を参照してくださいすることができます)私は私のテストで実行してるものです:

NSLog(@"BundlePaths: %@", [NSBundle allBundles]); 
    NSString * path = [[NSBundle bundleWithPath:@"$(TARGET_BUILD_DIR)"] pathForResource:@"SimpleTestList" ofType:@"plist"]; 
    STAssertNotNil(path, @"Bundle Location couldn't find the file specified"); 

本質的には、パス上のアサートが成功していないが、私は」バンドルリソースをコピーするように指示したunitTestバンドルを参照するために、パスまたはディレクトリに何を入れるべきかわかりません。 [NSBundle mainBundle]を呼び出しても機能しません。

+0

Garyの解を捨てて、私は次の[Xcode:TEST対DEBUGプリプロセッサマクロ]を考え出しました(http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597)。 #6763597)。 – ma11hew28

答えて

70

私はそれを理解しました。ユニットテストでファイルを開くためには、あなたのように開くために、ファイルを指定する必要があります:

NSString * filePath = [[NSBundle bundleForClass:[self class] ] pathForResource:@"SimpleTestList" ofType:@"plist"]; 

あなたのユニットテストバンドルの一部としてコンパイルされていますクラスでこれを含めると、そのクラスがします単体テストバンドル内でSimpleTestList.plistファイルを調べます。

単体テストの場合は、「バンドルリソースのコピー」を設定して、ユニットテストバンドルにplistを含めるようにしてください。

+0

それはまさに私の問題でした。これを投稿していただきありがとうございます! – kubi

+0

問題ありません!うれしかったよ! =) – Gary

+0

また、誰かが不思議に思っていた場合、私はmanagedObjectModelsに関してもこのリンクを見つけました。同様の状況。 http://www.spacevatican.org/2009/9/10/unit-testing-core-data-iphone-apps – Gary

3

アプリケーションデリゲートが必要な場合は、シミュレータではなくデバイス自体でユニットテストを実行する必要があります。また、ユニットテストの出力がコンソールに表示され、ビルド結果には表示されません。

重要なことは、実行可能ファイルの外で実行されるロジックテストと完全実行環境を必要とする統合システムテストの2種類のユニットテストがあることです。

ターゲットとして選択されたシミュレータを使用してロジックテストを実行する必要があります。実行されない場合、実行されません。

デバイス上の実行可能ファイルの一部として統合システムテストを実行する必要があります。これを達成するには、新しいターゲットが必要です。

申し訳ありませんが、これはすべて非常に複雑です。この面は、多くの他の単体テストフレームワークと比べてまだ進行中です。

+0

ええと、私がしていることのために、アプリケーションデリゲートを持っている必要はないでしょう。私が現時点で達成しようとしているのは私のモデルをテストすることです。最新のdevkitリリースでOCUnitを使用する前は、アプリケーション内の派生クラスでテストを行いました。私はその派生クラスをインスタンス化し、ユーザーが見るビューを実行して表示する前に、別のスレッドで自身をテストします。私はそれを所属する単体テストに分解しようとしています。私の現在の問題は、今ではバンドルに入っていてもplistファイルを見るためにOCUnitテストを取得することに問題があります。 – Gary

+0

...実際には "バンドル内"という意味で、バンドル内のそのコピーフォルダに追加したという意味です。 – Gary

0

(文字列のパスではなくURLを使用して)上記のゲーリーの答えのスウィフト3翻訳は次のとおりです。

let url = Bundle(for: type(of: self)).url(forResource: "SimpleTestList", withExtension: "plist") 

お知らせ重要かつ非自明一部type(of: self)の代わり[self class]

関連する問題