我相信知道您是否在测试内运行是完全合法的。有许多原因可能会有所帮助。例如,在运行测试时,我会从App Delegate中的application-did / will-finish-launching方法中提早返回,从而使测试的启动速度更快,而与我的单元测试无关。但是,由于许多其他原因,我不能进行纯粹的“逻辑”测试。
我曾经使用过@Michael McGuire所描述的出色技术。但是,我注意到它在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];
}
使用此方法的一个警告是,如果您从主应用程序方案运行测试(正如XCTest允许的那样)(也就是说,不选择其中一个测试方案),则不会设置此环境变量。