iOS Swift: séparer AppDelegate pour XCTest

En raison de quelques problèmes, je souhaite que la cible XCTest dans un projet exécute un délégué d'application distinct. En utilisant ObjC, c'était un process relativement simple: manipulez main.m (voir: https://stackoverflow.com/a/15725328/1299041 ).

Comme il semble qu'une application Swift est initialisée avec @UIApplicationMain dans AppDelegate, est-il possible de s'initialiser avec un AppDelegate distinct pour la cible de test?

Il est fortement déconseillé d'append des conditions à la vérification normale du code s'il est testé. Au lieu de cela, vous devriez AppDelegate votre AppDelegate dans les tests pour faire ce que vous voulez.

Ensuite, vous pouvez replace le délégué de UIApplication par setUp dans la super class de vos XCTestCase .

 class MockAppDelegate:NSObject, UIApplicationDelegate { } class BaseTest: XCTestCase { override func setUp() { super.setUp() UIApplication.sharedApplication().delegate = MockAppDelegate() } } class Test1: BaseTest { override func setUp() { super.setUp() // normal testing } } 

Si vous voulez toujours arrêter l'exécution de code pour les tests, voici ma méthode qui fonctionne bien:

Vous pouvez append un paramètre de démarrage à l'application qui indique qu'il s'agit d'une exécution de test Application Start Start

Ces parameters sont accessibles à partir de NSUserDefaults

 #define IS_TESTS [[NSUserDefaults standardUserDefaults] boolForKey:@"TESTING"] 

Cette solution à ceci est la suivante:

  1. Dupliquez la cible de votre application existante et renommez-la en quelque chose de approprié. Dans votre cas peut-être 'TestingHarness' ou un tel. Notez que vous souhaiterez également modifier l'identifiant du bundle et renommer le file Info.plist correspondant. Renommer le file Info.plist signifie que vous devrez modifier le paramètre de nom de file Info.plist dans l'onglet Paramètres de construction de votre nouvelle cible pour correspondre au nouveau nom.

  2. Créez un autre file *AppDelegate.swift . Dans votre cas, je l'appellerais TestAppDelegate.swift .

  3. Copiez le contenu de votre file AppDelegate.swift existant dans TestAppDelegate.swift et modifiez-le comme vous le souhaitez. Veillez à laisser l'annotation @UIApplicationMain et à implémenter les callbacks UIApplicationDelegate nécessaires.

  4. Modifiez l'appartenance cible de chacun de vos files *AppDelegate.swift afin que AppDelegate.swift ne soit pas inclus dans votre nouvelle cible 'TestHarness' et que TestAppDelegate.swift ne soit pas inclus dans la cible de votre application principale. (Vous modifiez l'appartenance cible d'un file en le sélectionnant dans le browser de files et en ouvrant l'inspecteur de files auquel vous pouvez accéder par défaut dans la barre latérale droite ou en le choisissant dans le menu sous Affichage -> Utilitaires.

  5. Vous disposez maintenant de deux cibles distinctes avec des delegates d'application distincts que vous pouvez créer et exécuter de manière indépendante. La dernière étape consiste à sélectionner votre nouvelle cible 'TestHarness' en tant qu'application hôte pour vos cibles de test. (Cliquez sur l'input de projet de niveau supérieur dans le browser de files, puis click la cible de test souhaitée dans la sous-list.Sur l'onglet Général, l'application hôte est la seule list déroulante disponible.)

Note: ces instructions sont pour Xcode 7.2.