【问题标题】:How to tear down Core Data Stack?如何拆除核心数据堆栈?
【发布时间】:2017-05-23 00:18:27
【问题描述】:

我想为我的 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(),但是数据没有重置,它始终是持久的。

那么我怎样才能拆掉核心数据栈呢?

【问题讨论】:

    标签: ios swift core-data swift3 xctest


    【解决方案1】:

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

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

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

    并像这样删除它:

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

    【讨论】:

      【解决方案2】:

      自 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)
          }
      

      新的方式应该是这样的。

      【讨论】:

      • 但是如何重新设置这个堆栈呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多