2012-08-14 33 views
14

मैं एक कस्टम इकाई माइग्रेशन नीति के साथ अपने माइग्रेशन के लिए मैपिंग मॉडल बना रहा हूं, और मैं वास्तव में इस माइग्रेशन के लिए कुछ यूनिट परीक्षण बनाना चाहता हूं। जब मैं ऐप चलाता हूं तो माइग्रेशन सही ढंग से काम करता प्रतीत होता है, लेकिन जब मैं यूनिट टेस्ट के माध्यम से माइग्रेशन चलाता हूं तो मेरी एनएसईएनटीटी माइग्रेशन पॉलिसी सबक्लास विधियों को बिल्कुल नहीं कहा जाता है।मैं कोर डेटा माइग्रेशन का परीक्षण कैसे कर सकता हूं?

मैं एक्सकोड के अंतर्निर्मित ओसीयूनीट फ्रेमवर्क का उपयोग कर रहा हूं।

मेरे परीक्षण कोड:

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

मेरे मानचित्रण मॉडल है कि -createRelationshipsForDestinationInstance:entityMapping:manager:error: पद्धति निर्धारित करता है एक कस्टम NSEntityMigrationPolicy निर्दिष्ट करता है, लेकिन मेरी नीति इकाई परीक्षण से कहा जाता है कभी नहीं है। जब मैं माइग्रेशन चलाता हूं, मॉडल को नए संस्करण में संशोधित किया जाता है - अपेक्षित गुण सही जगहों पर दिखाई देते हैं।

कोई विचार मैं यूनिट परीक्षण में काम करने के लिए अपनी माइग्रेशन नीति कैसे प्राप्त कर सकता हूं?

उत्तर

4

समस्या निकला लाइन

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

में होने की अगर मैं

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

तो परीक्षण कार्यों को सही ढंग से करने के लिए इसे बदल जाते हैं।

2

स्विफ्ट 3

बदलें चर modelName और अपने मॉडल के लिए modelNameVersionFormatString फ़ाइल नाम

import XCTest 
import CoreData 

class RCCoreDataMigrationTests: XCTestCase { 

    private let storeType = NSSQLiteStoreType 
    private let modelName = "Model" 
    private let modelNameVersionFormatString = "Model-%@" 

    private func storeURL(_ version: String) -> URL? { 
     let storeURL = URL(fileURLWithPath: "\(NSTemporaryDirectory())\(version).sqlite") 
     return storeURL 
    } 

    private func createObjectModel(_ version: String) -> NSManagedObjectModel? { 
     let bundle = Bundle.main 
     let managedObjectModelURL = bundle.url(forResource: modelName, withExtension: "momd") 
     let managedObjectModelURLBundle = Bundle(url: managedObjectModelURL!) 
     let modelVersionName = String(format: modelNameVersionFormatString, version) 
     let managedObjectModelVersionURL = managedObjectModelURLBundle!.url(forResource: modelVersionName, withExtension: "mom") 
     return NSManagedObjectModel(contentsOf: managedObjectModelVersionURL!) 
    } 

    private func createStore(_ version: String) -> NSPersistentStoreCoordinator { 
     let model = createObjectModel(version) 
     let storeCoordinator = NSPersistentStoreCoordinator(managedObjectModel: model!) 
     try! storeCoordinator.addPersistentStore(ofType: storeType, 
               configurationName: nil, 
               at: storeURL(version), 
               options: nil) 
     return storeCoordinator 
    } 

    private func migrateStore(fromVersionMOM: String, toVersionMOM: String) { 
     let store = createStore(fromVersionMOM) 
     let nextVersionObjectModel = createObjectModel(toVersionMOM)! 
     let mappingModel = NSMappingModel(from: [Bundle.main], forSourceModel: store.managedObjectModel, destinationModel: nextVersionObjectModel)! 
     let migrationManager = NSMigrationManager(sourceModel: store.managedObjectModel, destinationModel: nextVersionObjectModel) 
     do { 
      try migrationManager.migrateStore(from: store.persistentStores.first!.url!, 
               sourceType: storeType, 
               options: nil, 
               with: mappingModel, 
               toDestinationURL: storeURL(toVersionMOM)!, 
               destinationType: NSSQLiteStoreType, 
               destinationOptions: nil) 
     } catch { 
      print("Error: \(error)") 
      XCTAssertNil(error) 
     } 
     try! FileManager.default.removeItem(at: storeURL(toVersionMOM)!) 
     try! FileManager.default.removeItem(at: storeURL(fromVersionMOM)!) 
    } 

    func testMigratingStores() { 
     migrateStore(fromVersionMOM: "1486", toVersionMOM: "1487") 
    } 
} 
संबंधित मुद्दे