测试核心数据



我想为我的核心数据管理器设置一个模拟。

我正在为核心数据堆栈使用旧方法执行此操作,但希望为练习执行此操作。

在我设置的主核心数据管理器中

var objectContext: NSManagedObjectContext! = nil
    var entity: NSEntityDescription! = nil
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
    objectContext = appDelegate.persistentContainer.viewContext
    entity = NSEntityDescription.entity(forEntityName: Constants.entityName, in: objectContext)!

现在显然我不能在我的模拟中使用 UIApplication 的持久容器。

所以我尝试使用以下方法:

objectContext =  NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
let entityOne = NSEntityDescription.insertNewObject(forEntityName: Constants.entityName, into: objectContext)

但是,我收到错误"NSInvalidArgumentException","+entityForName:nil不是用于搜索实体名称'TaskEntity'的合法NSPersistentStoreCoordinator">

那么如何为我的模拟设置一个新的对象上下文呢?

一种解决方案是创建一个完整的核心数据堆栈,但让持久存储仅驻留在内存中。这样,您就不必处理某些应用程序委托依赖项。将上下文设置为 nil,然后从协调器中删除存储tearDown()

class TestExample: XCTestCase {
    var storeCordinator: NSPersistentStoreCoordinator!
    var managedObjectContext: NSManagedObjectContext!
    var managedObjectModel: NSManagedObjectModel!
    var store: NSPersistentStore!
    override func setUp() {
        super.setUp()
        managedObjectModel = NSManagedObjectModel.mergedModel(from: nil)
        storeCordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
        do {
            store = try storeCordinator.addPersistentStore(
                ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil)
        } catch {
            XCTFail("Failed to create a persistent store, (error)")
        }
        managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = storeCordinator
    }

最新更新