当我运行单元测试时,我想跳过一些代码(例如,我不想运行[[UIApplication sharedApplication] openURL:..]
)。我正在寻找一个运行时检查,如果我当前正在运行单元测试。
我知道我见过检查Objective-C运行时的代码,如果单元测试正在运行,但再也找不到它。
发布于 2014-07-11 09:22:29
您可以从google-toolbox-for-mac使用this method
// Returns YES if we are currently being unittested.
+ (BOOL)areWeBeingUnitTested {
BOOL answer = NO;
Class testProbeClass;
#if GTM_USING_XCTEST // you may need to change this to reflect which framework are you using
testProbeClass = NSClassFromString(@"XCTestProbe");
#else
testProbeClass = NSClassFromString(@"SenTestProbe");
#endif
if (testProbeClass != Nil) {
// Doing this little dance so we don't actually have to link
// SenTestingKit in
SEL selector = NSSelectorFromString(@"isTesting");
NSMethodSignature *sig = [testProbeClass methodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
[invocation setSelector:selector];
[invocation invokeWithTarget:testProbeClass];
[invocation getReturnValue:&answer];
}
return answer;
}
使用NSClassFromString
和NSInvocation
原因是允许在不链接到xctest或ocunit的情况下编译代码
发布于 2017-09-12 05:07:39
我不确定这会持续多久,但它现在适用于我的9.0 beta 6 (9M214v)版本。
let isTesting = { () -> Bool in
if let _ = ProcessInfo.processInfo.environment["XCTestConfigurationFilePath"] {
return true
} else if let testingEnv = ProcessInfo.processInfo.environment["DYLD_INSERT_LIBRARIES"] {
return testingEnv.contains("libXCTTargetBootstrapInject.dylib")
} else {
return false
}
}()
不需要更改构建环境或方案。
根据您运行的是单个测试用例还是整个测试套件,似乎有两个不同的环境变量在起作用。此外,该变量的值也会根据您是在模拟器中运行还是在真实设备上运行而有所不同。
发布于 2016-03-25 04:26:05
我认为你可以像这样检查Xcode7.3
-(BOOL) isRunningUnitTests
{
NSDictionary* environment = [ [ NSProcessInfo processInfo ] environment ];
NSString* theTestConfigPath = environment[ @"XCTestConfigurationFilePath" ];
return theTestConfigPath != nil;
}
https://stackoverflow.com/questions/24688512
复制相似问题