2011-08-06 17 views
25

Quiero hacer una prueba de aplicación que analiza algunos json, almacena datos básicos y lee algunos objetos.Proyecto Xcode cómo detectar el destino mediante programación o cómo usar env vars

¿Cómo puedo saber mi código si se está ejecutando como parte de una prueba o ejecución normal? Solo una forma de saber "¿estamos en el blanco de prueba"? Debido a que la aplicación cuando se activa ahora inicia una serie de solicitudes para completar mi coredata con información del servidor. No quiero que haga esto durante mis pruebas. Quiero iniciar la aplicación, leer HARDCODED json desde un archivo y almacenar esto utilizando los mismos métodos que de otra manera en coredata, y verificar los resultados.

Si alguien pudiera explicar cómo pasar pares clave-valor específicos por cada objetivo que puedan leerse desde la aplicación, estaría aún más encantado.

Respuesta

32

No importa ... descubrió que está en "Esquemas" que configura esto.

Por ejemplo, si desea que TARGET = TEST esté disponible durante Test y TARGET = RUN para mostrar durante la ejecución, simplemente configúrelo en su Scheme> Environment Variables> Name/Value.

Luego de su aplicación se puede hacer:

[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"] 

Usando la configuración de creación con macros del preprocesador no funcionó para mí b/c mi destino de prueba (para la aplicación de pruebas/integración) depende de mi principal (no prueba) objetivo, por lo que el objetivo principal se crea primero y eso es lo que se ejecuta, y usted termina con las macros del preprocesador de destino principal, aunque esté después de las definidas en el objetivo que ejecutó. Si me perdí algo aquí, alguien puede explicarlo por favor.

+4

¡Gran respuesta! Además, si lo haces 'isTargetTest = YES', entonces puedes volver a leer un BOOL del entorno' [[[NSProcessInfo processInfo]] objectForKey: @ "isTargetTest"] '. El BOOL se puede usar directamente en una declaración 'if', sin la necesidad de comparar una cadena – Olaf

+2

esto devuelve nulo para mí – 2cupsOfTech

10

Si con "objetivo de prueba" quiere decir sus pruebas de unidad (es decir, Product > Test o ⌘U), puede agregar una macro de preprocesador al objetivo y verificar esa macro en su código. Esto permite que algo como lo siguiente:

#ifdef TEST 
    // Load the hard-coded data. 
#else 
    // Load data from the server. 
#endif 

Para ello, haga clic en el archivo de proyecto en el navegador de proyectos, seleccione el destino de la prueba, haga clic en la pestaña Build Settings, búsqueda de "macros", haga doble clic en la opción Preprocessor Macros, ¡y agrega uno!

5

Puede usar la función siguiente.

+(BOOL) isRunningTests 
{ 
    NSDictionary* environment = [[NSProcessInfo processInfo] environment]; 
    NSString* injectBundle = environment[@"XCInjectBundle"]; 
    return [[injectBundle pathExtension] isEqualToString:@"xctest"]; 
} 
5

Hay dos situaciones que se refieren a:

  1. correr un poco de código si un objetivo determinado se selecciona como Tests y
  2. condicionalmente #import algunos archivos para un objetivo determinado, como Tests.

Código de destino para el Target Test:

crear una macro en el archivo de ProjectName-Prefix.pch de la siguiente manera:

#define IsTestTarget [[[[NSProcessInfo processInfo] environment][@"XCInjectBundle"] pathExtension] isEqualToString:@"xctest"] 

y luego lo llaman en cualquier lugar de la aplicación:

if (IsTestTarget) { 
    //Do something specific for test target; 
} else { 
    //Otherwise do something else 
} 

Condicional #import:

Para #import ciertos archivos cuando se selecciona Tests objetivo, es necesario añadir un Preprocessor Macro a su objetivo Test y utilizarlo como:

#ifdef APPTESTS 
    #import "TestSpecificFile.h" 
#else 
    #import "SomeOtherFile.h" 
#endif 

aquí es cómo se puede añadir un Preprocessor Macro:

enter image description here

+0

Lamentablemente, la importación condicional no funcionará para mí. Las macros del preprocesador para el objetivo de prueba afectarán SOLO a los archivos fuente de prueba. Las clases de "Producción" se construirán con la configuración principal del objetivo. –

+0

Su aplicación siempre se desarrolla con el objetivo de la aplicación, esto es para mostrarle una forma de averiguar mediante programación qué pruebas se están ejecutando. Si no está ejecutando las pruebas, entonces no necesitará esto de todos modos. –

Cuestiones relacionadas