2011-11-25 18 views
6

Tengo una aplicación iOS con datos persistentes utilizando NSCoding y más precisamente NSKeyedArchiver. Esta aplicación ya está disponible en la App Store.¿Cómo probar la unidad NSCoding?

Estoy trabajando en la versión 2 de la aplicación y el modelo de datos debería cambiar. Entonces necesito manejar la migración del modelo de datos. Quiero que esté cubierto por pruebas unitarias.

En mis pruebas, quiero generar dinámicamente datos persistentes con el modelo de datos anterior, iniciar la migración y ver si todo salió bien.

Actualmente, el archivo de un objeto se parece a esto:

MyDataModelObject *object = .... 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:object forKey:key]; 
[archiver finishEncoding]; 

El problema es, MyDataModelObject podría ser re-factorizar o incluso eliminada en la versión 2 de la solicitud. Así que no puedo usar esta clase en mis pruebas para generar un 'archivo de versión anterior'.

¿Hay alguna manera de simular lo que se hace en el método encodeWithCoder: de una clase sin usar esta clase?


Lo que me gustaría lograr es la siguiente

- testMigrationFrom_v1_to_v2 { 
    // simulate an archive with v1 data model 
    // I want this part of the code to be as simple as possible 
    // I don't want to rely on old classes to generate the archive 
    NSDictionary *person = ... // { firstName: John, lastName: Doe } 
    NSDictionary *adress = ... // { street: 1 down street, city: Butterfly City } 
    [person setObject:adress forKey:@"adress"]; 

    // there's something missing to tell the archiever that: 
    // - person is of type OldPersonDataModel 
    // - adress is of type OldAdressDataModel 

    [archiver encodeObject:person forKey:@"somePerson"]; 
    // at this point, I would like the archive file to contain : 
    // a person object of type OldPersonDataModel, that has an adress object of type OldAdressModel 

    NewPersonModel *newPerson = [Migration readDataFromV1]; 

    // assertions 
    NSAssert(newPerson.firstName, @"John"); 
    NSAssert(newPerson.lastName, @"Doe"); 
} 

Respuesta

1

Realmente no entiendo su pregunta, así que les daré dos respuestas:

Puede precargar una instancia de NSDictionary con claves/valores que usaría con su clase anterior y simplemente cree un nuevo archivador con clave, repita todas las teclas y archívelo.

También puede obtener método -attributeKeys de ninguna clase para obtener todas las claves y luego usar posiblemente el código para simular un archivo:

NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:object forKey:key]; 
for (NSString *key in object.attributeKeys) { 
    [archive encodeObject:[object valueForKey:key] forKey:key]; 
} 
[archive finishEncoding]; 

En el punto de migración de datos, NSKeyedArchiver tiene el método -setClass:forClassName: y puedes admite todas tus claves antiguas en tu nuevo objeto para traducirlas a propiedades diferentes.

+0

gracias por su respuesta, he editado la pregunta para que quede más claro (con suerte) – David

+1

attributeKeys es parte de NSClassDescription, que no existe en iOS. – quellish

Cuestiones relacionadas