18

カスタムエンティティ移行ポリシーを使用して移行用のマッピングモデルを構築しています。この移行用の単体テストをいくつか構築したいと思います。アプリを実行すると移行は正しく機能するようですが、単体テストを介して移行を実行すると、NSEntityMigrationPolicyサブクラスメソッドがまったく呼び出されません。

Xcodeの組み込みOCUnitフレームワークを使用しています。

私のテストコード:

- (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];
}

私のマッピングモデルは、メソッドを定義するカスタムNSEntityMigrationPolicyを指定しています-createRelationshipsForDestinationInstance:entityMapping:manager:error:が、単体テストからポリシーが呼び出されることはありません。移行を実行すると、モデルが新しいバージョンに変更されます。期待される属性が適切な場所に表示されます。

ユニットテストで移行ポリシーを機能させる方法について何かアイデアはありますか?

4

2 に答える 2

4

問題は行にあることが判明しました

NSMappingModel *mappingModel = [NSMappingModel
  inferredMappingModelForSourceModel:version1Model
  destinationModel:version2Model error:&error];

に変更すると

NSMappingModel *mappingModel = [NSMappingModel
  mappingModelFromBundles:@[[NSBundle bundleForClass:[MyTestClass class]]]
  forSourceModel:version1Model destinationModel:version2Model];

その後、テストは正しく機能します。

于 2012-08-17T18:57:42.043 に答える