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 中公开包包。
我有一堆 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 中公开包包。