我想为我的核心数据管理器设置一个模拟。
我正在为核心数据堆栈使用旧方法执行此操作,但希望为练习执行此操作。
在我设置的主核心数据管理器中
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
}