iOS Swift: Separate AppDelegate para XCTest

Debido a un par de problemas, quiero que el objective XCTest en un proyecto ejecute un delegado de aplicación por separado. Usando ObjC, este fue un process relativamente sencillo: manipular main.m (ver: https://stackoverflow.com/a/15725328/1299041 ).

Dado que parece que una aplicación Swift se inicializa con @UIApplicationMain en AppDelegate, ¿es posible inicializar con un AppDelegate por separado para el objective de testing?

No es recomendable agregar condiciones para la comprobación normal del código si se está probando. En su lugar, debería simular su AppDelegate en testings para hacer lo que quiera.

Entonces podría replace el delegado de UIApplication está setUp en super class de su XCTestCase 's.

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

Si aún desea detener la ejecución del código para las testings, este es mi método que funciona bien:

Puede agregar parameters de inicio a la aplicación, lo que indica que se trata de una ejecución de testing. Ejecución de la aplicación de inicio

Estos parameters son accesibles desde NSUserDefaults

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

Esta solución a esto es la siguiente:

  1. Duplique el destino de su aplicación actual y cambie el nombre a algo apropiado. En tu caso tal vez 'TestingHarness' o algo así. Tenga en count que también querrá cambiar el identificador de package y cambiar el nombre del file Info.plist correspondiente. Cambiar el nombre del file Info.plist significa que tendrá que cambiar la configuration de nombre de file Info.plist en la pestaña Configuración de compilation del nuevo destino para que coincida con el nuevo nombre.

  2. Cree otro file *AppDelegate.swift . En su caso, lo llamaría TestAppDelegate.swift .

  3. Copie el contenido de su file existente AppDelegate.swift en TestAppDelegate.swift y edite como desee. Asegúrese de dejar la anotación @UIApplicationMain e implementar las devoluciones de llamada de UIApplicationDelegate necesarias.

  4. Cambie la membresía objective de cada uno de sus files *AppDelegate.swift para que AppDelegate.swift no esté incluido en su nuevo objective 'TestHarness' y TestAppDelegate.swift no esté incluido en el objective de su aplicación principal. (Edita la Membresía de destino de un file seleccionándola en el Explorador de files y abriendo el Inspector de files a la que puede acceder en la barra lateral derecha de manera pnetworkingeterminada o seleccionándola en el menu en Ver -> Utilidades).

  5. Ahora tiene dos objectives separados con Delegados de aplicaciones por separado que puede crear y ejecutar de forma independiente. El último paso es seleccionar su nuevo objective 'TestHarness' como la aplicación de host para sus objectives de testing. (Haga clic en la input de proyecto de nivel superior en el Explorador de files, luego click el objective de testing deseado en la sub-list. En la pestaña General, verá la aplicación de host como el único menu desplegable disponible).

Nota: estas instrucciones son para Xcode 7.2.