gpt4 book ai didi

swift - CoreData 的 insertNewObjectForEntityForName 使转换为自定义类失败并进行单元测试

转载 作者:搜寻专家 更新时间:2023-10-31 23:03:12 25 4
gpt4 key购买 nike

我有一个 AEUser 类,它是 NSManagedObject 的一个子类。该类有一个创建自身新实例的方法。对于默认目标,正常路由效果很好:

static func newDefaultUser(moc: NSManagedObjectContext) -> AEUser {
let newUser = NSEntityDescription.insertNewObjectForEntityForName("AEUser", inManagedObjectContext: moc) as! AEUser
newUser.uid = sDefaultUser // some string constant
newUser.name = sDefaultUser // some string constant
return newUser
}

但是,当执行使用相同函数创建新用户的 XCTestCase 时,会在运行时发生转换错误。我突然不能再将新对象转换为 AEUser 了。在默认目标上,一切正常。

现在有趣的是,上述代码的“更长”变体可以完美地用于测试用例。现在 Actor 当然不再需要了。但是上面的代码应该产生完全相同的对象。此外,当使用断点并查看上面分配给 newUser 的实际对象时,它似乎应该是一个 AEUser 对象。

private static func newDefaultUser(moc: NSManagedObjectContext) -> AEUser {
let entity = NSEntityDescription.entityForName("AEUser", inManagedObjectContext: moc)
let newUser = AEUser(entity: entity!, insertIntoManagedObjectContext: moc)
newUser.uid = sDefaultUser // some string constant
newUser.name = sDefaultUser // some string constant
return newUser
}

有人可以解释为什么上面的代码在使用 XCTestCase/一个单独的测试目标时不起作用,特别是为什么尽管上面的代码看起来像第二个变体一样生成正确类型的对象,但运行时转换仍然失败?

(运行 Xcode 6.3.2 和 iOS 8.3 SDK。)

最佳答案

我遇到了类似的问题。进行了一些调试以弄清楚。希望这也适用于您。

我认为问题在于强制转换 as! AEUser 正在尝试转换为 MyAppTests.AEUser,这可能与您的数据模型想要的类不匹配(它可能想要 MyApp.AEUser ).您需要使用 MyApp.AEUser 以便数据模型引用正确的内容。尝试使用一些断点调试您的测试并创建一个 AEUser 的随机实例并查看 Xcode 所说的类型是什么。我敢打赌它是 MyAppTests.AEUser

我的解决方案如下所示:我有一个名为 Team 的实体,它存在于名为 Somersault 的应用程序中。所以,在我的数据模型中(你这样做是因为 this ):

enter image description here

然后,确保您的 NSManagedObject 子类及其所有属性都是公共(public)的:

public class Team: NSManagedObject {
@NSManaged public var name: String
}

然后在测试模块(我的是 SomersaultTests)的测试文件中,引用原始模块:

import Somersault

并照常使用您的子类。确保您没有在您的测试模块的编译源下有您的NSManagedObject文件;您希望您的测试模块引用原始模块

您现在应该能够像这样直接转换您的 NSManagedObject:

let newTeam: Team = NSEntityDescription.insertNewObjectForEntityForName("Team",
inManagedObjectContext: self.moc!) as! Team

祝你好运。

关于swift - CoreData 的 insertNewObjectForEntityForName 使转换为自定义类失败并进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30918830/

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