2012-07-31 10 views
9

Seguí this great article para entrar en Pruebas unitarias con respecto a los Datos principales. La configuración parece simple e involucra solo algunas líneas de código de vista.¿Cómo puedo decirle a MagicalRecord que no utilice los datos básicos basados ​​en archivos sino una configuración de memoria?

- (void)setUp; 
{ 
    [MagicalRecord setDefaultModelWithClass:[self class]]; 
    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

- (void)tearDown; 
{ 
    [MagicalRecord cleanUp]; 
} 

- (void)testSomeCalculationOnMyEntity; 
{ 
    NSNumber *count = [MyEntity MR_numberOfEntities]; 
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation"); 
} 

@end 

El problema es que cada vez que, por ejemplo, cheque por la cantidad de entidades en la memoria puesta en marcha de la base de datos llamando [MyEntity MR_numberOfEntities] (como arriba), me da la cantidad de objetos, los cuales se almacenan en la configuración basada en archivos que son un par de miles de objetos. ¿Como sucedió esto? Me refiero a que la segunda línea en setUp indica la memoria en uno, ¿no es así? Y este caso debería devolver 0 como la cantidad de objetos almacenados.

¡Gracias por cualquier sugerencia!

Editar:

@casademora me puso en el camino correcto. La siguiente configuración de trabajos funciona bien ahora.

- (void)setUp; 
{ 
    [MagicalRecord cleanUp]; // This solved the mystery. 

    // I don't now why I had to remove this line, though. 
    // [MagicalRecord setDefaultModelWithClass:[self class]]; 

    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

- (void)tearDown; 
{ 
    [MagicalRecord cleanUp]; 
} 

- (void)testSomeCalculationOnMyEntity; 
{ 
    NSNumber *count = [MyEntity MR_numberOfEntities]; 
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation"); 
} 

@end 

Respuesta

1

El método utilizado para configurar los datos centrales aquí no debería cargar nunca un almacén basado en archivos. Si ingresas usando el depurador, deberías ver que inicializa un coordinador de tienda persistente utilizando el tipo NSInMemoryStore ... eventualmente.

Supongo que por qué sucede esto podría deberse a que no agregó una llamada de limpieza a un caso de prueba anterior, lo que provocó que una pila de datos central anterior o tienda persistente se quedara en esta prueba.

Esta es la configuración de código exacta que utilizo para probar los datos básicos de la base todo el tiempo, y nunca ha cargado una tienda persistente no deseada para mí. Al depurar en el método, asegúrese de ejecutar este comando:

po [self persistentStores] 

Cuando se llega a la carga del coordinador de almacén persistente. Si hay tiendas existentes, esto al menos verificará que existan algunas tiendas preexistentes.

+0

Gracias por su respuesta. La prueba que estoy ejecutando es la única. El objetivo de mis pruebas depende del objetivo de mi aplicación. En mi AppdeDegate, configuré la pila de datos centrales para usar un archivo. ¿Podría ser que este se cargue antes de las pruebas y que, por lo tanto, se use en lugar del nuevo en la memoria uno? Si es así, ¿cómo puedo evitar esto? – Aufwind

+0

Gracias por ponerme en el camino correcto. Resolví este misterio llamando '[MagicalRecord cleanUp];' justo antes de '[MagicalRecord setupCoreDataStackWithInMemoryStore];' en el método '- (void) setUp;'. Tuve que eliminar '[MagicalRecord setDefaultModelFromClass: [self class]];'. Ver mi edición de la pregunta. – Aufwind

+0

Guau, eso no debería haber sido necesario ... llamar a limpieza en el método tearDown debería haber sido suficiente. Esto es bastante extraño. – casademora

1

También podría agregar lo siguiente que se realiza una vez en la inicialización de la clase. Esto funcionó para mí.

+(void)setUp 
    { 
      [MagicalRecord cleanUp]; 
    } 
Cuestiones relacionadas