Базовые тесты данных, не вызывающие постоянных ошибок хранилищ - PullRequest
0 голосов
/ 03 июля 2019

Когда я тестирую данные Core, используя приведенный ниже тест, если я выполняю ожидание (как показано), я получаю ошибку, что «Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ (неизвестно). Он не может выполнить операцию сохранения».Однако вывод моих журналов печати подтверждает, что заметка была добавлена ​​в мое основное хранилище данных.

override func setUp() {
    super.setUp()
    managedObjectModel = NSManagedObjectModel.mergedModel(from: nil)
    storeCordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
    do {
        store = try storeCordinator.addPersistentStore(
            ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
    } catch {
        XCTFail("Failed to create a persistent store, \(error)")
    }
}

func testCoreDataAddNoteItem() {
    let expectation = XCTestExpectation(description: #function)
    let managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = storeCordinator
    let entity = NSEntityDescription.entity(forEntityName: Constants.entityName, in: managedObjectContext)!
    let coreDataManager = CoreDataManager(mainObjectContext: managedObjectContext, entity: entity)
    let note = Note(entity: entity, insertInto: coreDataManager.getMainManagedObjectContext()!)
    note.contents = "Contents"
    note.title = "title"
    note.createdAt = Date()
    note.contents = "contents"
    note.emoji = String(describing: 0x1F601)
    note.updatedAt = Date()

    coreDataManager.getMainManagedObjectContext()!.performAndWait {
        coreDataManager.saveContext()
    }

    coreDataManager.getMainManagedObjectContext()!.performAndWait {
        let request = NSFetchRequest<Note>(entityName: Constants.entityName)
        request.returnsObjectsAsFaults = false
        do {
            let result = try managedObjectContext.fetch(request)
            for data in result as [NSManagedObject] {
                print(data.value(forKey: "title") as! String)
                print(data.value(forKey: "title") as! String == "title")
                XCTAssertEqual(data.value(forKey: "title") as! String, "title")
                expectation.fulfill()

            }
        } catch {
            print("Failed")
        }
    }

    wait(for: [expectation], timeout: 3.0)
}

Для справки вот мой основной стек данных:

public protocol CoreDataManagerProtocol {
    func saveContext ()
    init()
    func getMainManagedObjectContext() -> NSManagedObjectContext?
    func getChildManagedObjectContext() -> NSManagedObjectContext?
    func saveContext (_ context: NSManagedObjectContext)
}

class CoreDataManager: CoreDataManagerProtocol {

    // MARK: Properties
    private let modelName: String
//    private var entity: NSEntityDescription! = nil

//    lazy var managedObjectContext: NSManagedObjectContext = {
//        // The alternative to this is to set up our own store
//        return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
//    }()

    private var managedObjectContext: NSManagedObjectContext! = nil

    private(set) lazy var childManagedObjectContext: NSManagedObjectContext = {
        // Initialize Managed Object Context
        let myChildManagedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

        // Configure Managed Object Context
        myChildManagedObjectContext.parent = self.managedObjectContext

        return myChildManagedObjectContext
    }()

    // NSPersistentContainer - hides implementation details of how persistent stores are configured
    lazy var storeContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: Constants.modelName)
        container.loadPersistentStores { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        }
        return container
    }()


    func getMainManagedObjectContext() -> NSManagedObjectContext? {
        return managedObjectContext
    }

    func getChildManagedObjectContext() -> NSManagedObjectContext? {
        return childManagedObjectContext
    }

    init (mainObjectContext: NSManagedObjectContext, entity: NSEntityDescription) {
        self.modelName = Constants.modelName // "EmojiNotes"
        managedObjectContext = mainObjectContext
//        self.entity = NSEntityDescription.entity(forEntityName: Constants.entityName, in: managedObjectContext)!
//        self.entity = entity
    }

    required init() {
        managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        self.modelName = Constants.modelName
    }

    func saveContext (_ context: NSManagedObjectContext) {
        // performblock and execute on correct thread
        context.perform {
            if context.hasChanges {
                do {

                    try context.save()
                    // inform listeners that we have updated the model
                    // NotificationCenter.default.post(name: Notification.Name.dataModelDidUpdateNotification, object: self, userInfo: nil)

                } catch let error as NSError {
                    print("Unresolved error \(error), \(error.userInfo)")
                }
            }
        }
    }

    func saveContext () {

        if childManagedObjectContext.hasChanges {
            childManagedObjectContext.performAndWait {
                do {

                    try childManagedObjectContext.save()
                    // inform listeners that we have updated the model
                    // NotificationCenter.default.post(name: Notification.Name.dataModelDidUpdateNotification, object: self, userInfo: nil)

                } catch let error as NSError {
                    print("Unresolved error \(error), \(error.userInfo)")
                }
            }
        }
        print (managedObjectContext.persistentStoreCoordinator?.persistentStores.count)
        if managedObjectContext.hasChanges {
            managedObjectContext.perform {
            do {

                try self.managedObjectContext.save()
                // inform listeners that we have updated the model
                // NotificationCenter.default.post(name: Notification.Name.dataModelDidUpdateNotification, object: self, userInfo: nil)

            } catch let error as NSError {
                print("Unresolved error \(error), \(error.userInfo)")
            }
            }
        }

    }


}

Я нашел решение для этого:

попробуй!coreDataManager.getChildManagedObjectContext () ?. save ()

Как сохранить без ошибки.

Так почему же это решение?

...