【问题标题】:Core Data Unit Tests with in-memory store crash内存存储崩溃的核心数据单元测试
【发布时间】:2015-03-27 16:36:40
【问题描述】:

我正在尝试使用内存存储测试我的应用程序与 CoreData 的交互,但是当我尝试转换此调用中给出的对象时代码崩溃:

let newEntity: AnyObject = NSEntityDescription.insertNewObjectForEntityForName("File", inManagedObjectContext: moc)
let newFile = newEntity as RSFile

RSFile在核心数据模型的Class字段中正确设置并包含在 中,该代码在正常应用程序中运行良好。我检查了托管对象模型是否已正确创建,并且一切似乎都已正确设置,但我最终在断点上方几行带有"dynamic cast failed" 字符串的机器代码中结束。

此外,如果我将newEntity 转换为NSManagedObject 并放置一个断点以便我可以在运行时检查它,那么那里的一切似乎都有效,因此问题仅出在演员表上。我查看了其他建议,但我找不到我的配置中缺少的任何内容。关于可能出现什么问题的任何想法?

更新

我创建了一个示例项目,该项目演示了应用运行时的工作核心数据交互以及运行测试时的崩溃。 https://github.com/kujenga/CoreDataIssue

【问题讨论】:

  • 你是如何运行测试的?运行测试时模拟器是否启动?
  • 该应用程序适用于 Mac,而不是 iOS,但是是的,该应用程序正在运行。
  • 可能是命名空间问题。模型中的托管对象子类是否声明为Package.RSFile?如果是这样,请尝试简化为 RSFile
  • 不,我在阅读此处的帖子后尝试了该解决方案:jessesquires.com/swift-coredata-and-testing 但随后我的常规应用程序代码也崩溃了,说找不到命名空间类。所以我把它改回RSFile
  • 也许您已将类添加到两个目标。相反,您应该在测试类中 import 您的主应用程序包。

标签: macos cocoa unit-testing swift core-data


【解决方案1】:

在一个简单的测试项目中,我让它像这样工作:

  1. 确保未将类也添加到测试目标中。
  2. 在您的测试类之上导入您的 MyApp 包。
  3. 使用as? 投射。

像这样:

var newEntity = NSEntityDescription.insertNewObjectForEntityForName(
   "File", inManagedObjectContext: context) as? PSFile

编辑

确定以上确实返回nil(仅在测试类中)后,这是我的工作解决方案:

  1. 在测试中创建您需要的所有类public,包括托管对象子类。
  2. 如果是托管对象,您还需要将您打算访问的属性(属性)设为公开。
  3. 不要将类添加到测试目标(如果这样做,转换将失败)。
  4. 改为将import YourAppName 添加到测试文件中。
  5. 使用无条件强制转换。

像这样[测试]:

let newEntity = NSEntityDescription.insertNewObjectForEntityForName(
   "File", inManagedObjectContext: moc) as! RSFile

【讨论】:

  • 我目前已将我的主应用程序目标中的所有 swift 文件添加到我的测试目标的编译源中,并且从那里删除 RSFile 会导致大量编译错误,无论我在哪里使用 RSFile 类型应用。通过将这些文件添加到目标中,我是否在做一些根本性的错误?此外,使用as? 进行转换只会产生一个 nil 值,因为转换失败,并且当我尝试解开它时程序会崩溃。
  • 如果您有时间将我在问题更新中链接到的项目与您的测试项目进行比较,请告诉我有什么区别。否则,如果您能够将您的代码发布在某个地方,我很乐意看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多