2017-01-08 17 views
2

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内部関数を呼び出すことを試みたが、データがありませんリセット、それは常に永続的です。

コアデータスタックをどのように切断できますか?

答えて

3

古いデータはあなたの文脈とは関係ありませんが、PersistentStoreです。これはコアデータを使用しているため、データを永続させます。

setup()でスタックを初期化する前に、ストアを削除してデータを削除してください。

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

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

新しい方法と呼ばれる新しい方法を導入しました:

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

をし、このようにそれを取り除く:あなたはこのようにそれを見つけることができますこの。

関連する問題