【发布时间】:2020-09-30 04:46:56
【问题描述】:
我正在尝试在我的 swift 包中测试 CoreData,因为 SPM 现在支持包括 .xcdatamodel 在内的捆绑资源,但我的测试似乎无法找到我的 NSManagedObjects。从测试中对核心数据进行单元测试的步骤是什么?
当我尝试从测试中创建 NSManagedObject 时出现此错误:
+entityForName: could not locate an entity named 'StriveUser' in this model. (NSInternalInconsistencyException)
我已经三遍检查了命名,一切都是正确的。
我正在从我的测试中创建这样的对象:
let object = NSEntityDescription.insertNewObject(forEntityName: "StriveUser", into: self.inMemoryStore.context)
这是我定位 .xcdatamodel 的代码:
fileprivate var managedObjectModel: NSManagedObjectModel = {
guard let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main]) else {
preconditionFailure("Error getting ManagedObjectModel")
}
return managedObjectModel
}()
final class InMemoryStore {
let context: NSManagedObjectContext
init() {
let description = NSPersistentStoreDescription()
description.type = NSInMemoryStoreType
description.shouldAddStoreAsynchronously = false
let container = NSPersistentContainer(name: Constants.modelName, managedObjectModel: managedObjectModel)
container.persistentStoreDescriptions = [description]
container.loadPersistentStores {_, error in
if let error = error {
fatalError("Failed to load store: \(error.localizedDescription)")
}
}
self.context = container.viewContext
}
}
【问题讨论】:
-
@JoakimDanielson 在我问这个之前我已经尝试过谷歌搜索,我觉得这可能是 SPM 特有的,所以这就是我问的原因
-
您的 ManagedObjectModel 捆绑包参考需要更新。如果您从 swift 包资源加载,则需要使用
Bundle.module。你需要有一个访问器,它是你的包的一部分,它使用包模块返回模块。 -
@richardpiazza 谢谢先生,如果您想留下这个作为答案,我很乐意接受它
标签: swift unit-testing core-data swift-package-manager