我有一堆快速的文件,在CoreData之上提供了一些服务。我的单元测试运行良好。我决定使用 XCode 11 将所有这些移动到 Swift 包中。
单元测试不再运行,运行时错误为caught "NSInternalInconsistencyException", "NSFetchRequest could not locate an NSEntityDescription for entity name
。
为了进行单元测试,我有一个 xcdatamodel 文件,如果包包含在测试组中。但似乎 XCode 不允许我真正包含这个 xcdatamodel 文件作为测试目标的一部分。
如何将此 xcdatamodel 包含在测试目标中?
根据这篇文章,不支持.xcdatamodeld
文件,因为你不能捆绑资源,所以如果你想使用核心数据模型,你必须以编程方式完成(在帖子中展示了如何(。
附言我也在自己解决这个问题,我认为要记住的另一件事是指定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.bundleModel.momd
App_AppTests.bundle<test resources>
AppTests
您需要阅读应用捆绑包,但测试只能访问测试捆绑包。如果您尝试执行从应用程序传递类Bundle(for:)
,则它不起作用。
解决方案是在要测试的包类中公开包捆绑包。