テストの実行時に Xcode 自体が環境変数を設定するため、スキームで作成する必要はありません。他の目的ですでにそうしている場合は、そうするのが実用的かもしれません。ただし、テストが実行されているかどうかを判断するために、Xcode の環境変数を使用できます。コードの大部分は objc では次のようになります。これをアプリのデリゲートにスローできます。
オプション1:
static BOOL isRunningTests(void) __attribute__((const));
static BOOL isRunningTests(void)
{
NSDictionary* environment = [[NSProcessInfo processInfo] environment];
NSString* injectBundle = environment[@"XCInjectBundle"];
NSLog(@"TSTL %@", [injectBundle pathExtension]);
return [[injectBundle pathExtension] isEqualToString:@"xctest"] || [[injectBundle pathExtension] isEqualToString:@"octest"];
}
isRunningTests()
次に、テストを確認する必要がある場所に電話するだけです。ただし、このコードは実際には別の場所、たとえば TestHelper クラスに格納する必要があります。
オプション 2:
// TestHelper.h
#import <Foundation/Foundation.h>
extern BOOL isRunningTests(void) __attribute__((const));
// TestHelper.m
#import "TestCase.h"
extern BOOL isRunningTests(void)
{
NSDictionary* environment = [[NSProcessInfo processInfo] environment];
NSString* injectBundle = environment[@"XCInjectBundle"];
NSLog(@"TSTL %@", [injectBundle pathExtension]);
return [[injectBundle pathExtension] isEqualToString:@"xctest"] || [[injectBundle pathExtension] isEqualToString:@"octest"];
}
まだグローバル変数を使用しており、クラス名の選択は実際には無関係であることに注意してください。それを維持することが理にかなっているクラスです。
オプション 3:
そして、Swift では、Objective-C と Swift の両方で動作するようにクラスでラップする必要があります。次のようにできます。
class TestHelper: NSObject {
static let isRunningTests: Bool = {
guard let injectBundle = NSProcessInfo.processInfo().environment["XCInjectBundle"] as NSString? else {
return false
}
let pathExtension = injectBundle.pathExtension
return pathExtension == "xctest" || pathExtension == "octest"
}()
}