我有一堆快速文件,它们提供了 CoreData 之上的一些服务。我的单元测试运行良好。我决定使用 XCode 11 将所有这些移动到 Swift 包中。
单元测试不再运行,出现运行时错误
caught "NSInternalInconsistencyException", "NSFetchRequest could not locate an NSEntityDescription for entity name
。
为了进行单元测试,我有一个 xcdatamodel 文件,该文件包含在包的测试组中。但 XCode 似乎不允许我真正包含此 xcdatamodel 文件作为测试目标的一部分。
如何将此 xcdatamodel 包含在测试目标中?
根据 this post,不支持
.xcdatamodeld
文件,因为您无法捆绑资源,因此如果您想使用 Core Data 模型,则必须以编程方式执行此操作(在帖子中展示了如何操作)。
P.S.我自己也在弄清楚这一点,我认为要记住的另一件事是在实例化
managedObjectModel
时指定name
(除了NSPersistentContainer
之外)。
我在 2022 年遇到了这个问题,所以这里有一个更新的解决方案。
公开包含模型的包中的 Bundle.module:
import Foundation
public enum BundleReference {
public static let bundle = Bundle.module
}
然后照常创建托管对象模型:
let mom = NSManagedObjectModel.mergedModel(from: [BundleReference.bundle])
为什么需要这个?您的测试在派生数据中看起来像这样:
AppTests.xctest
App_App.bundle\Model.momd
App_AppTests.bundle\<test resources>
AppTests
您需要读取应用程序包,但测试只能访问测试包。如果您尝试从应用程序中传递一个类,这是行不通的。
解决方案是在要测试的包的类中公开包束。
Bundle(for:)