我有一个使用 NSCoding 更准确地说是 NSKeyedArchiver 保存数据的 iOS 应用程序。此应用程序已在 App Store 上提供。
我正在开发应用程序的第 2 版,并且数据模型应该更改。所以我需要处理数据模型迁移。我希望它被单元测试覆盖。
在我的测试中,我想使用旧数据模型动态生成持久数据,启动迁移并查看一切是否顺利。
目前,归档对象如下所示:
MyDataModelObject *object = ....
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:object forKey:key];
[archiver finishEncoding];
问题是,MyDataModelObject 可能在应用程序的版本 2 中被重构甚至删除。所以我不能在我的测试中使用这个类来生成一个“旧版本存档”。
encodeWithCoder:
有没有办法在不使用此类的情况下模拟类的方法中所做的事情?
我想要实现的是以下
- 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");
}