2011-04-13 15 views
9

comenzando desde la plantilla CoreData, he creado una aplicación para iPhone que usa CoreData para manipular un Modelo de datos. Funciona hasta ahora ...¿Cómo hacer UnitTests con CoreData?

Ahora decidí, necesito algunas pruebas de "unidad" para comprobar si el modelo de datos básicos se manipula correctamente (hasta ahora solo he hecho comprobaciones manuales y comprobé la base de datos directamente con CoreDataEditor). He seguido

http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html

sobre cómo configurar unittests en Xcode. Esto funciona hasta el momento tanto para Pruebas Lógicas como de Aplicación. Sin embargo, no puedo hacer que las pruebas de "unidad" funcionen con un backend CoreData (no encuentra mi modelo de datos y no sé qué incluir o vincular, etc.)

¿Hay un puntero/descripción? sobre cómo hacer las pruebas de "unidad" de una aplicación de datos de núcleo de iphone?

PD: Sé que las pruebas con la base de datos no son estrictamente pruebas de "unidad". No me importa si la prueba está en el simulador con la aplicación real (ApplicationTesting) o si solo es un backend de datos centrales específicamente para las pruebas unitarias (LogicTest) que llenaría con algunos objetos de prueba durante la configuración.

EDIT: He encontrado How to unit test my models now that I am using Core Data? y http://chanson.livejournal.com/115621.html pero ahora me encontré con el problema descrito en iPhone UnitTesting UITextField value and otest error 133 ... bueno, excepto que tengo de código de error 134: -? (((¿Alguna idea

Respuesta

11

. Aceptar que tengo trabajo ...

  1. Crear LogicTests como se describe aquí (sección de configuración de Prueba lógica): http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html

  2. Agregue manualmente CoreData.framework al objetivo recién creado para las pruebas lógicas: arrástrelo desde el destino de la aplicación al destino de la prueba lógica (carpeta "enlace binario con bibliotecas").

  3. Haga clic derecho en su * .xcdatamodeld y seleccione Obtener información -> Objetivos. Seleccione el objetivo Pruebas lógicas (por alguna extraña razón, el objetivo de la aplicación real no fue seleccionado en mi caso ... pero eso funciona)

  4. En su clase de prueba unitaria (que creó en el paso 1: LogicTests.m), agregue el siguiente método:

    - (void) setUp { 
    
        NSArray *bundles = [NSArray arrayWithObject:[NSBundle bundleForClass:[self class]]]; 
        NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:bundles]; 
        STAssertNotNil(mom, @"ManangedObjectModel ist nil"); 
    
        NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom]; 
        STAssertTrue([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL] ? YES : NO, @"Should be able to add in-memory store");  
    
        self.context = [[NSManagedObjectContext alloc] init]; 
        self.context.persistentStoreCoordinator = psc; 
    
        [mom release]; 
        [psc release]; 
    } 
    

Ahora usted tiene una prueba de lógica con datos básicos de apoyo creados. La prueba lógica se realiza de forma aislada (sin simulador) construyendo el objetivo LogicTests. Para esto, se crea una base de datos temporal en memoria. En sus métodos de prueba ahora puede hacer algo como:

- (void) testStuff {  
    NSManagedObject *managedObj = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:self.context]; 

    [managedObj setValue:[NSNumber numberWithInt:90000] forKey:@"id"]; 

    NSError *error = nil; 
    if (![self.context save:&error]) { 
     STFail(@"Fehler beim Speichern: %@, %@", error, [error userInfo]); 
    } 
} 

Espero que esto ayude ... ¡Diviértase!

+1

Una pena que el enlace no conduzca a nada más. – Houman

+0

Encontré este enlace al código de muestra que parece ser el complemento de ese enlace que ya no funciona: https://developer.apple.com/library/ios/samplecode/UnitTests/Introduction/Intro.html – idStar

Cuestiones relacionadas