What is the proper way to detect if unit tests are running at runtime in Xcode?

objective-c, ocunit, xctest

Solution

You can use this method from google-toolbox-for-mac

// 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;
}

The reason that `NSClassFromString` and `NSInvocation` are used is to allow code compile without linking to xctest or ocunit

Problem

When I'm running unit tests, I'd like to skip some code (e.g. I don't want `[[UIApplication sharedApplication] openURL:..]` to run). I'm looking for a runtime check if I'm currently running units tests or not. I know I have seen code that checks the Objective-C runtime if unit tests are running but am not able to find it anymore.

Original source