2011-08-06 5 views
25

jsonを解析し、コアデータに格納し、いくつかのオブジェクトを読み込むアプリケーションテストを行いたいとします。Xcode projectターゲットをプログラムで検出する方法またはenv変数を使用する方法

私のコードは、テストや通常の実行の一部として実行されているかどうかをどのように知ることができますか? "私たちはテストターゲットですか?"アプリケーションが起動すると、サーバーからの情報で自分のコアデータにデータを取り込むという一連のリクエストが開始されるためです。私はそれが私のテストの間にこれをすることを望んでいない。私はアプリケーションを起動し、ファイルからHARDCODED jsonを読み込み、これと同じ方法をcoredataに格納して結果を確認したい。

誰かが特定のキーと値のペアを、ターゲットごとにアプリ内から読み込むことができる方法を説明することができたら、私はさらに喜んでいます。

答えて

32

気にしないでください...あなたがこれを設定するのが「スキーム」であることが分かりました。

たとえば、テスト中にTARGET = TESTを使用可能にし、実行中にTARGET = RUNを表示するには、Scheme> Environment Variables> Name/Valueに設定します。あなたが行うことができますあなたのアプリから次に

:プリプロセッサマクロでビルド設定を使用して

[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"] 

は、B/C(アプリケーション/統合テストのために)私のテスト対象が私のメインに依存している私のために動作しませんでした(ありませんテストターゲット)を使用しているため、メインターゲットが最初に構築され、それが実行されます。実行したターゲットで定義されたものの後ろにあっても、メインターゲットプリプロセッサマクロで終わります。私がここで何かを見逃した場合、誰か説明してください。

+4

グレートアンサー!マイナーな追加: 'isTargetTest = YES'にすると、BOOLを' [[NSProcessInfo processInfo]環境] objectForKey:@ "isTargetTest"] 'から読み込むことができます。文字列を比較する必要なしに、BOOLを 'if'文で直接使用することができます – Olaf

+2

これは私のためにnullを返します – 2cupsOfTech

10

「テストターゲット」とは、単体テスト(つまり、Product > Testまたは⌘U)を意味する場合は、プリプロセッサマクロをターゲットに追加し、コード内のそのマクロを確認できます。これは、次のようなものができます。

#ifdef TEST 
    // Load the hard-coded data. 
#else 
    // Load data from the server. 
#endif 

これを行うには、プロジェクトナビゲータでプロジェクトファイルをクリックして、テスト対象を選択し、「マクロ」のBuild Settingsタブ、検索をクリックし、ダブルPreprocessor Macrosオプションをクリックし、 1つを追加してください!

5

以下の機能を使用できます。対処するためにあり

+(BOOL) isRunningTests 
{ 
    NSDictionary* environment = [[NSProcessInfo processInfo] environment]; 
    NSString* injectBundle = environment[@"XCInjectBundle"]; 
    return [[injectBundle pathExtension] isEqualToString:@"xctest"]; 
} 
5

二つの状況:

  1. を実行し、いくつかのそのようTestsなどの特定のターゲットを選択した場合、コード、および
  2. 条件付き#importなどTestsなどの特定のターゲットのためのいくつかのファイル。テストターゲット用

ターゲットコード:

次のようにあなたのProjectName-Prefix.pchファイルでマクロを作成します。その後、

#define IsTestTarget [[[[NSProcessInfo processInfo] environment][@"XCInjectBundle"] pathExtension] isEqualToString:@"xctest"] 

とアプリ内のどこにでもそれを呼び出す:

if (IsTestTarget) { 
    //Do something specific for test target; 
} else { 
    //Otherwise do something else 
} 

条件付き#import

#importするために、特定のファイルTests対象が選択されている場合、あなたはあなたのTestターゲットにPreprocessor Macroを追加して、それを使用する必要があります。ここでは

#ifdef APPTESTS 
    #import "TestSpecificFile.h" 
#else 
    #import "SomeOtherFile.h" 
#endif 

あなたがPreprocessor Macroを追加する方法です。

enter image description here

+0

残念ながら、条件付きインポートは機能しません。テストターゲット用のプリプロセッサマクロは、テストソースファイルのみに影響します。 「プロダクション」クラスは、主要なターゲット設定でビルドされます。 –

+0

あなたのアプリは常にアプリケーションターゲットでビルドされています。これは、テストが実行されていることをプログラムで調べる方法を示しています。あなたがテストを実行していない場合は、とにかくこれは必要ありません。 –

関連する問題