我想为我的核心数据管理器设置一个模拟。
我用核心数据堆栈的老方法来做这件事,但我想在练习中做这件事。
在我设置的主核心数据管理器中
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)!
很明显,我不能在mock中使用UIApplication的持久化容器。
因此,我尝试使用以下代码:
objectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
let entityOne = NSEntityDescription.insertNewObject(forEntityName: Constants.entityName, into: objectContext)
然而,我得到错误"NSInvalidArgumentException","+entityForName: nil不是用于搜索实体名称‘TaskEntity’的合法NSPersistentStoreCoordinator“
那么我如何为我的模拟设置一个新的objectContext呢?
发布于 2019-06-14 13:30:31
一种解决方案是创建一个完整的核心数据堆栈,但让持久存储只驻留在内存中。这样你就不需要处理一些应用委托依赖了。将context设置为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
}
https://stackoverflow.com/questions/56591498
复制相似问题