var entities = _managedContext.executeFetchRequest(fetchRequest, error: &error) as [MyEntity]?
以上结果导致:“致命错误:NSArray元素无法与控制台上的Swift数组元素类型匹配”.
var entities = _managedContext.executeFetchRequest(fetchRequest, error: &error) let e = entities[0] // Works fine let ee = e as NSManagedObject // Works fine let eee = e as MyEntity // Crash: Exception breakpoint, then ERR_BAD_ACCESS - no messages on console
以上结果导致崩溃,但仅在从单元测试中调用时!
我有两个目标,一个主目标和一个测试目标(正常的默认设置). NSManagedObject类被选择为在两个目标中,以便测试可以访问它们.这些子类是用Swift编写的,没有Objective-C.
在单元测试期间,我使用内存中的persistentStoreCoordinator(尽管我在AppDelegate中使用相同的一个设置尝试了相同的结果).
Swift的调试器几乎没用(抱歉不得不发泄).当我查看executeFetchRequest返回的数组的变量时,它不会展开以显示元素,并且任何“po”它或其内容的尝试都会彻底崩溃XCode – 加上SourceKit每隔3分钟崩溃就会产生一个非常大的问题.令人沮丧的一天…但我离题了.我可以发现的唯一有用的信息是返回的数组是TestTarget.MyEntity而不是MainTarget.MyEntity.我认为,在转换时,它正在尝试转换为MainTarget.MyEnity(因为测试中的代码驻留在MainTarget中),因此尝试崩溃.
能够对涉及Core Data的代码进行单元测试似乎是一件基本的事情,我无法相信这有多么令人沮丧.有没有人能够让XCTests与NSManagedObject子类一起使用?你如何让CoreData在MainTarget中返回正确的子类而不是TestTarget中的子类?
我尝试过的其他一些事情包括:
>将@objc(MyEntity)注释添加到子类中,但这会导致来自Core Data的有关未找到的类的消息,从而返回NSManagedObject实例(显然不能转换为子类)
>链接和提及的建议:How to unit-test NSFetchedResultsController in Swift
>建议:executeFetchRequest throw fatal error: NSArray element failed to match the Swift Array Element type
>敲打头撞墙,直到头晕.我建议不要采取这种措施,因此效率不高.