テスト内で実行しているかどうかを知りたいのは完全に正当だと思います。それが役立つ理由はたくさんあります。たとえば、テストの実行では、AppDelegateのapplication-did / will-finish-launchingメソッドから早期に戻り、単体テストに密接に関係しないコードのテストをより速く開始できるようにします。それでも、他の多くの理由から、純粋な「論理」テストに進むことはできません。
私は以前、上記の@MichaelMcGuireによって説明された優れた手法を使用していました。しかし、Xcode 6.4 / iOS8.4.1の周りで機能しなくなったことに気づきました(おそらくもっと早く壊れました)。
つまり、私のフレームワークのテストターゲット内でテストを実行すると、XCInjectBundleが表示されなくなります。つまり、フレームワークをテストするテストターゲット内で実行しています。
したがって、@ Fogmeisterが提案するアプローチを利用して、私の各テストスキームは、チェックできる環境変数を設定するようになりました。
次に、APPSTargetConfiguration
この簡単な質問に答えることができる、というクラスにあるコードをいくつか示します。
static NSNumber *__isRunningTests;
+ (BOOL)isRunningTests;
{
if (!__isRunningTests) {
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
NSString *isRunningTestsValue = environment[@"APPS_IS_RUNNING_TEST"];
__isRunningTests = @([isRunningTestsValue isEqualToString:@"YES"]);
}
return [__isRunningTests boolValue];
}
このアプローチの1つの注意点は、メインのアプリスキームからテストを実行する場合、XCTestで実行できるように(つまり、テストスキームのいずれかを選択しないで)、この環境変数セットを取得できないことです。