如何拆除核心数据堆栈?

时间:2017-01-08 18:17:18

标签: ios swift core-data swift3 xctest

我想为我的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
    }
}

我尝试在context.reset()函数内调用tearDown但是,数据未重置,它始终是持久的。

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

2 个答案:

答案 0 :(得分:5)

旧数据与您的上下文无关,但与您的$('table').children('tbody').children('tr').filter( function (key, element) { if ( parseFloat($(element).children(':nth-child(3)').text()) < parseFloat($('#counter-low').val()) || parseFloat($(element).children(':nth-child(3)').text()) > parseFloat($('#counter-high').val()) ) return true; else return false; }).css('display', 'none'); 无关。这就是您使用Core Data的原因,可以保留您的数据。

PersistentStore初始化堆栈之前,删除商店以删除数据。你可以这样找到它:

setup()

并将其删除:

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

答案 1 :(得分:3)

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

新的方式应该是这样的。