Swift 使用 CoreData 进行包单元测试

Swift package unit testing with CoreData

我有一堆 swift 文件,它们在 CoreData 之上提供一些服务。我进行了单元测试 运行ning 很好。我决定使用 XCode 11.

将所有这些移动到 Swift 包中

单元测试不再 运行,运行时间错误 caught "NSInternalInconsistencyException", "NSFetchRequest could not locate an NSEntityDescription for entity name

为了进行我的单元测试,我有一个 xcdatamodel 文件,如果包。但似乎 XCode 不允许我真正将此 xcdatamodel 文件作为测试目标的一部分。

如何将此 xcdatamodel 包含在测试目标中?

根据 this post.xcdatamodeld 文件不受支持,因为您无法捆绑资源,因此如果您想使用 Core Data 模型,则必须以编程方式进行(展示了如何在 post).

P.S. 我自己也在弄清楚这个问题,我认为要记住的另一件事是指定 managedObjectModel(除了name)if/when实例化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:) 传递 class,它将无法正常工作。

解决方案是在要测试的包的 class 中公开包包。