使用 CoreData 进行 Swift 包单元测试



我有一堆快速的文件,在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:),则它不起作用。

解决方案是在要测试的包类中公开包捆绑包。

相关内容

  • 没有找到相关文章

最新更新