使用 CoreData 进行 Swift 包单元测试

问题描述 投票:0回答:3

我有一堆快速文件,它们提供了 CoreData 之上的一些服务。我的单元测试运行良好。我决定使用 XCode 11 将所有这些移动到 Swift 包中。

单元测试不再运行,出现运行时错误

caught "NSInternalInconsistencyException", "NSFetchRequest could not locate an NSEntityDescription for entity name

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

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

swift core-data package-managers xcode11
3个回答
3
投票

根据 this post,不支持

.xcdatamodeld
文件,因为您无法捆绑资源,因此如果您想使用 Core Data 模型,则必须以编程方式执行此操作(在帖子中展示了如何操作)。

P.S.我自己也在弄清楚这一点,我认为要记住的另一件事是在实例化

managedObjectModel
时指定
name
(除了
NSPersistentContainer
之外)。


2
投票

我在 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

您需要读取应用程序包,但测试只能访问测试包。如果您尝试从应用程序中传递一个类,这是行不通的。

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


0
投票

Bundle(for:)

© www.soinside.com 2019 - 2024. All rights reserved.