Ich erstelle ein Mapping-Modell für meine Migration mit einer benutzerdefinierten Entitätsmigrationsrichtlinie, und ich möchte wirklich einige Komponententests für diese Migration erstellen. Die Migration scheint korrekt zu funktionieren, wenn ich die App ausführe, aber meine Methoden der NSEntityMigrationPolicy-Unterklasse werden überhaupt nicht aufgerufen, wenn ich die Migration über einen Komponententest ausführe.Wie kann ich eine Kerndatenmigration testen?
Ich verwende das integrierte OCUnit-Framework von Xcode.
Mein Testcode:
- (void)test1to2Migration_appIdentifierMoved {
[self createVersion1Store];
// TODO Perform migration
NSManagedObjectModel *version1Model = [self version1Model];
NSManagedObjectModel *version2Model = [self version2Model];
NSError *error = nil;
NSMappingModel *mappingModel = [NSMappingModel
inferredMappingModelForSourceModel:version1Model
destinationModel:version2Model error:&error];
STAssertNotNil(mappingModel, @"Error finding mapping model: %@", error);
NSMigrationManager *migrationManager =
[[[NSMigrationManager alloc]
initWithSourceModel:version1Model
destinationModel:version2Model]
autorelease];
BOOL migrationSucceeded =
[migrationManager migrateStoreFromURL:self.version1StoreURL
type:NSSQLiteStoreType
options:nil
withMappingModel:mappingModel
toDestinationURL:self.version2StoreURL
destinationType:NSSQLiteStoreType
destinationOptions:nil
error:&error];
STAssertTrue(migrationSucceeded, @"Error migrating store: %@", error);
// TODO Verify appIdentifier is moved from Project to its Tests
[self deleteTempStores];
}
Mein Mapping-Modell gibt eine benutzerdefinierte NSEntityMigrationPolicy, die die -createRelationshipsForDestinationInstance:entityMapping:manager:error:
Methode definiert, aber meine Politik wird nie aus dem Unit-Test genannt. Wenn ich die Migration ausführe, wird das Modell auf die neue Version geändert - die erwarteten Attribute werden an den richtigen Stellen angezeigt.
Irgendwelche Ideen, wie ich meine Migrationspolitik in einem Komponententest arbeiten lassen kann? die Testfunktionen zu
NSMappingModel *mappingModel = [NSMappingModel
mappingModelFromBundles:@[[NSBundle bundleForClass:[MyTestClass class]]]
forSourceModel:version1Model destinationModel:version2Model];
dann richtig