Last active
November 1, 2023 19:11
-
-
Save jonathan-beebe/09f4e588005925d78ab1 to your computer and use it in GitHub Desktop.
Detect if a Swift iOS app delegate is running unit tests
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
// Detect if the app is running unit tests. | |
// Note this only detects unit tests, not UI tests. | |
func isRunningUnitTests() -> Bool { | |
let env = NSProcessInfo.processInfo().environment | |
if let injectBundle = env["XCInjectBundle"] { | |
return NSString(string: injectBundle).pathExtension == "xctest" | |
} | |
return false | |
} | |
@UIApplicationMain | |
class AppDelegate: UIResponder, UIApplicationDelegate { | |
var window: UIWindow? | |
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { | |
if(isRunningUnitTests()) { | |
print("TESTING") | |
// Create an empty window. Useful for unit tests that might need to alter the view heirarchy or | |
// add views during their tests. | |
let window = UIWindow(frame: UIScreen.mainScreen().bounds) | |
window.rootViewController = UIViewController() | |
window.makeKeyAndVisible() | |
self.window = window | |
return true | |
} | |
// Perform the normal app init here | |
makeWindow() | |
return true | |
} | |
func makeWindow() { | |
// Do whatever you need here to create the root view controller of the app. | |
let vc = UIStoryboard.init(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("ViewController") | |
let window = UIWindow(frame: UIScreen.mainScreen().bounds) | |
window.rootViewController = vc | |
window.makeKeyAndVisible() | |
self.window = window | |
} | |
} |
This appears to have broke in Xcode 9 :(
It looks like they changed it to XCInjectBundleInto
. I've been using the following with pretty good success between versions:
func isRunningUnitTests() -> Bool {
let env = ProcessInfo.processInfo.environment
if env["XCTestConfigurationFilePath"] != nil {
return true
}
return false
}
Isn't it better?
func isRunningUnitTests() -> Bool {
return ProcessInfo.processInfo.environment.keys.contains("XCTestConfigurationFilePath")
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you so much! This is the only solution that ended up working for me.