Mam aplikację na iOS z danymi utrzymywanymi przy użyciu NSCoding, a dokładniej NSKeyedArchiver. Ta aplikacja jest już dostępna w App Store.Jak przeprowadzić test NSCoding na urządzeniu?
Pracuję nad wersją 2 aplikacji i model danych powinien się zmienić. Potrzebuję więc obsługi migracji modelu danych. Chcę, żeby był objęty testami jednostkowymi.
W swoich testach chcę dynamicznie generować utrwalone dane przy użyciu starego modelu danych, przeprowadzić migrację i sprawdzić, czy wszystko poszło dobrze.
Obecnie archiwizacji obiekt wygląda tak:
MyDataModelObject *object = ....
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:object forKey:key];
[archiver finishEncoding];
Problem polega na tym, MyDataModelObject może być ponownie uwzględnione lub nawet usunięte w wersji 2 aplikacji. Dlatego nie mogę używać tej klasy w moich testach do generowania "starego archiwum wersji".
Czy istnieje sposób, aby zasymulować, co robi się metodą encodeWithCoder:
klasy bez użycia tej klasy?
Co chciałbym osiągnąć jest następujące
- 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");
}
Dziękuję za odpowiedź, zredagowałem pytanie, aby było bardziej zrozumiałe (mam nadzieję). – David
attributeKeys jest częścią NSClassDescription, która nie istnieje w systemie iOS. – quellish