如何拆除核心数据堆栈?

How to tear down Core Data Stack?

我想为我的 Core Data 应用程序添加单元测试,但我知道如何重置测试之间的上下文。

这是我的 CoreDataStack 对象:

public final class CoreDataStack {
    var storeType: StoreType!
    public init(storeType: StoreType) {
        self.storeType = storeType
    }

    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "Transaction")
        container.loadPersistentStores(completionHandler: { (description, error) in
            if let error = error {
                fatalError("Unresolved error \(error), \(error.localizedDescription)")
            } else {
                description.type = self.storeType.type

            }
        })

        return container
    }()

    public var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
}

这就是我在测试中使用它的方式:

class PaymentTests: XCTestCase {

    var context: NSManagedObjectContext!

    override func setUp() {
        super.setUp()

        let coreDataStack = CoreDataStack(storeType: .inMemory)
        context = coreDataStack.context
    }
}

我尝试在 tearDown 函数中调用 context.reset(),但是数据没有被重置,它总是持久的。

那么我该如何拆除核心数据栈呢?

旧数据与您的上下文无关,但与您的 PersistentStore 无关。这就是您使用 Core Data 的目的,持久化您的数据。

setup() 中初始化您的堆栈之前删除存储以清除您的数据。你可以这样找到它:

let storeUrl = persistentContainer.persistentStoreCoordinator.persistentStores.first!.url!

并像这样删除它:

let fileManager = FileManager.default
fileManager.removeItem(at: storeUrl)

自 2015 年以来,Apple 推出了一种名为 destroyPersistentStore(at:,ofType:,options:)

的新方法
guard let storeURL = persistentContainer.persistentStoreCoordinator.persistentStores.first?.url else {
        return
    }
    do {
        try self.persistentContainer.persistentStoreCoordinator.destroyPersistentStore(at: storeURL, ofType: NSSQLiteStoreType, options: nil)
    } catch {
        print(error)
    }

新方法应该是这样的。