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");
}
gracias por su respuesta, he editado la pregunta para que quede más claro (con suerte) – David
attributeKeys es parte de NSClassDescription, que no existe en iOS. – quellish