gpt4 book ai didi

ios - 测试与非测试中的 Swift 和 CoreData 转换问题

转载 作者:IT王子 更新时间:2023-10-29 05:51:40 27 4
gpt4 key购买 nike

我在带有 CoreData 的 Xcode 6 上使用 Swift。

我已经阅读了发行说明并看到了这个 issue关于确保使用模块名称(应用程序名称)标记核心数据模型,以便您可以在运行时将 NSManagedObject 转换为您的模型类型。

当我这样做时,我可以让应用程序正常运行(好!)。然而,我的问题是,当我尝试测试相同的代码时,只要发生转换并出现 Swift dynamic cast failed 错误(错误 :() . 这使得我的应用程序难以测试。

在为测试和运行构建应用程序时,我们使用的模块名称是否有任何影响?

提前感谢任何指点...

跟进:

这并不理想:如上所述,为了让 Swift 使用 Core Data 模型,您需要用您的应用程序名称修饰类名称。这适用于构建应用程序,但测试以不同的应用程序名称运行!这意味着您需要进入数据建模器并将该类名从 myAppname.myEntity 更改为 myAppnameTests.myEntity,然后才能在使用或调用时按名称使用这些实体来自测试。

最佳答案

您完全正确,问题是当您运行应用程序时,它正在寻找 myAppname.myEntity,而当您作为测试运行时,它正在寻找 myAppnameTests.myEntity。我此时使用的解决方案 (Xcode 6.1) 是不填充 CoreData UI 中的 Class 字段,而是在代码中完成。

此代码将检测您是否作为 App vs Tests 运行并使用正确的模块名称并更新 managedObjectClassName

lazy var managedObjectModel: NSManagedObjectModel = {
// The managed object model for the application. This property is not optional...
let modelURL = NSBundle.mainBundle().URLForResource("Streak", withExtension: "momd")!
let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!

// Check if we are running as test or not
let environment = NSProcessInfo.processInfo().environment as [String : AnyObject]
let isTest = (environment["XCInjectBundle"] as? String)?.pathExtension == "xctest"

// Create the module name
let moduleName = (isTest) ? "StreakTests" : "Streak"

// Create a new managed object model with updated entity class names
var newEntities = [] as [NSEntityDescription]
for (_, entity) in enumerate(managedObjectModel.entities) {
let newEntity = entity.copy() as NSEntityDescription
newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
newEntities.append(newEntity)
}
let newManagedObjectModel = NSManagedObjectModel()
newManagedObjectModel.entities = newEntities

return newManagedObjectModel
}()

关于ios - 测试与非测试中的 Swift 和 CoreData 转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24636888/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com