2017-01-08 1 views
2

핵심 데이터 앱에 단위 테스트를 추가하고 싶지만 테스트간에 컨텍스트를 재설정하는 방법은 확실합니다. 데이터가 아닌, 내가 tearDown 함수 내에서 context.reset()를 호출하려고어떻게 핵심 데이터 스택을 해체할까요?

class PaymentTests: XCTestCase { 

    var context: NSManagedObjectContext! 

    override func setUp() { 
     super.setUp() 

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

하지만 :

이 내 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 
    } 
} 

그리고 이것은 내가 내 테스트에 사용하고 어떻게 리셋은 항상 지속됩니다.

그럼 핵심 데이터 스택을 해체 할 수 있습니까?

답변

3

이전 데이터는 컨텍스트와 관련이 없지만 사용자의 PersistentStore과는 관련이 없습니다. 이것이 핵심 데이터를 사용하여 데이터를 유지하는 것입니다.

setup()에서 스택을 초기화하기 전에 스토어를 삭제하여 데이터를 제거하십시오.

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

2015 년 이후, 애플과 같아야합니다 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! 

과 같이 제거 : 당신은 다음과 같이 찾을 수 있습니다 이.

관련 문제