2012-07-31 2 views
9

Ho seguito this great article per accedere al test dell'unità relativo ai dati principali. L'installazione sembra semplice e comporta solo alcune linee di vista del codice.Come posso dire a MagicalRecord di non utilizzare i dati base basati su file ma una configurazione in 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 

Il problema è che ogni volta che ad esempio assegno per l'importo di entità nella memoria messa a punto di Core Data chiamando [MyEntity MR_numberOfEntities] (come sopra), ottengo la quantità di oggetti, che sono memorizzati nell'impostazione basata su file, che sono un paio di migliaia di oggetti. Come succede? Intendo dire che la seconda riga in setUp indica quella in memoria, vero? E questo caso dovrebbe restituire 0 come quantità di oggetti memorizzati.

Grazie per eventuali suggerimenti!

Edit:

@casademora mi ha messo sulla strada giusta. La seguente installazione di lavori funziona bene per me ora.

- (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 

risposta

1

Il metodo utilizzato per impostare i dati di base qui non dovrebbe mai caricare un archivio basato su file. Se ci passi dentro usando il debugger, dovresti vedere che inizializza un coordinatore di archivio permanente usando il tipo NSInMemoryStore ... alla fine.

La mia ipotesi sul motivo per cui ciò potrebbe accadere potrebbe essere dovuto al fatto che non è stata aggiunta una chiamata di cleanUp a un caso di test precedente, causando un precedente stack di dati principale o un archivio persistente.

Questa è l'impostazione esatta del codice che utilizzo sempre per i dati del core dell'unità di test e non ha mai caricato per me un archivio persistente non intenzionale. Durante il debug nel metodo, assicurarsi di eseguire questo comando:

po [self persistentStores] 

Quando si arriva al caricamento della persistente coordinatore del negozio. Se ci sono negozi esistenti, questo almeno verificherà che ci siano alcuni negozi preesistenti in giro.

+0

Grazie per la risposta. Il test che sto eseguendo è l'unico. L'obiettivo dei miei test dipende dall'obiettivo della mia applicazione. Nel mio AppdDelegate ho impostato il Core Data Stack per usare un file. Potrebbe essere che questo viene caricato prima dei test, e che quindi viene usato al posto del nuovo in memoria? Se sì, come posso evitare questo? – Aufwind

+0

Grazie per avermi messo sulla strada giusta. Ho risolto questo mistero chiamando '[MagicalRecord cleanUp];' prima di '[MagicalRecord setupCoreDataStackWithInMemoryStore];' nel metodo '- (void) setUp;'. Ho dovuto rimuovere '[MagicalRecord setDefaultModelFromClass: [self class]];'. Vedi la mia modifica della domanda. – Aufwind

+0

Wow, che non avrebbe dovuto essere necessario ... chiamare cleanUp nel metodo tearDown avrebbe dovuto essere sufficiente. Questo è abbastanza strano. – casademora

1

È anche possibile aggiungere quanto segue che viene eseguito una volta sull'inizializzazione della classe. Questo ha funzionato per me.

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