2009-07-07 14 views
26

He estado siguiendo la documentación de Apple sobre pruebas de unidad de escritura para el iPhone, y la rutina no parece funcionar de inmediato. No estoy seguro de entender dónde la prueba unitaria va a obtener la referencia al delegado de la aplicación.iPhone - Recuperación de recursos para pruebas de unidades lógicas

Mis dependencias son como los siguientes: My_Program_target -> UnitTesting_target -> UnitTests_bundle

El siguiente fragmento de código es donde falla la aserción. Estoy muy familiarizado con CPPUNIT, pero tengo problemas para entender cómo se cruza.

- (void) testAppDelegate { 

    id yourApplicationDelegate = [[UIApplication sharedApplication] delegate]; 
    STAssertNotNil(yourApplicationDelegate, @"UIAppliation failed to find the AppDelegate"); 

} 

Además:

he decidido en mi acercamiento a hacer una prueba de la lógica. Intento leer en un archivo XML, pero no estoy teniendo suerte resolviendo el paquete, que me proporcionará la ruta por la que puedo acceder a mi archivo. He intentado pegar en la salida de la ruta por allBundles, pero esa ruta tampoco parece funcionar. A continuación se muestra la ejecución de lo que estoy en mi prueba (se puede ver el estado de depuración que estoy usando para dar salida a los caminos de los paquetes):

NSLog(@"BundlePaths: %@", [NSBundle allBundles]); 
    NSString * path = [[NSBundle bundleWithPath:@"$(TARGET_BUILD_DIR)"] pathForResource:@"SimpleTestList" ofType:@"plist"]; 
    STAssertNotNil(path, @"Bundle Location couldn't find the file specified"); 

Esencialmente, la aserción en el camino no tiene éxito, pero yo' No estoy seguro de qué poner para la ruta o directorio para hacer referencia a mi paquete unitTest que he indicado para copiar los recursos del paquete. Llamar a [NSBundle mainBundle] tampoco funciona.

+0

Aprovechando la solución de Gary, se me ocurrieron las siguientes [macros de preprocesador [Xcode: PRUEBA frente a DEBUG] (http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597 # 6763597). – ma11hew28

Respuesta

70

Bien, entonces lo he descubierto. Con el fin de abrir un archivo en una unidad de prueba, tendrá que especificar el archivo que desea abrir como:

NSString * filePath = [[NSBundle bundleForClass:[self class] ] pathForResource:@"SimpleTestList" ofType:@"plist"]; 

Si se incluye esto en una clase que está compilado como parte de su paquete de prueba de unidad, esa clase se mira dentro del paquete de prueba de la unidad para el archivo SimpleTestList.plist.

Para una prueba unitaria, solo asegúrese de configurar "Copiar recursos de paquete" para incluir su plist en su conjunto de prueba de unidad.

+0

Ese era exactamente mi problema también. ¡Gracias por publicar esto! – kubi

+0

¡Ningún problema! Me alegro de que ayudó! =) – Gary

+0

Además, en caso de que alguien se lo esté preguntando, también encontré este enlace en lo que respecta a managedObjectModels. Situación similar. http://www.spacevatican.org/2009/9/10/unit-testing-core-data-iphone-apps – Gary

3

Si necesita el delegado de la aplicación, debe ejecutar las pruebas de unidad en el dispositivo y no en el simulador. Además, verá que la salida de prueba unitaria aparecerá en la consola, no en los resultados de compilación.

Lo importante es saber que hay dos tipos de pruebas unitarias: pruebas lógicas que se ejecutan fuera del ejecutable y, a continuación, tipos de pruebas integradas del sistema que necesitan el entorno completo de ejecución.

Las pruebas lógicas DEBEN ejecutarse con el simulador seleccionado como objetivo o no se ejecutarán.

Las pruebas del sistema integrado DEBEN ejecutarse como parte del ejecutable, en el dispositivo; querrá un nuevo objetivo para lograr esto.

Lo siento, todo esto es muy complejo, este aspecto es todavía un trabajo en progreso en comparación con muchos otros marcos de pruebas de unidades.

+0

Hmm, tener el delegado de la aplicación probablemente no será necesario para lo que estoy haciendo entonces. Lo que estoy tratando de lograr en este momento es probar mi modelo. Antes de OCUnit en la última versión de devkit, hice mis pruebas en una clase derivada dentro de mi aplicación. Me gustaría crear una instancia de esa clase derivada, y se probaría a sí mismo en un hilo por separado antes de ejecutar y mostrar la vista que el usuario ve. Estoy tratando de factorizar eso en una prueba unitaria donde pertenece. Mi problema actual es que tengo problemas para obtener la prueba OCUnit para ver el archivo plist, incluso si está en el paquete. – Gary

+0

... en realidad por "en el paquete", quiero decir que lo agregué a esa carpeta de copia en el paquete. – Gary

0

La traducción Swift 3 de la respuesta de Gary anterior (utilizando una URL en lugar de una ruta de cadena) es:

let url = Bundle(for: type(of: self)).url(forResource: "SimpleTestList", withExtension: "plist") 

Aviso la parte crítica y no evidente type(of: self) en lugar de [self class].

Cuestiones relacionadas