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"
}()
}