核心数据单元测试内存存储崩溃

时间:2015-03-27 16:36:41

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

我正在尝试使用内存存储库测试我的应用程序与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

1 个答案:

答案 0 :(得分:1)

在一个简单的测试项目中,我让它的工作原理如下:

  1. 确保不将类添加到测试目标。
  2. 在测试类之上导入MyApp包。
  3. 使用as?投射。
  4. 像这样:

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

    修改

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

    1. 在测试public中创建所需的所有类,包括托管对象的子类。
    2. 如果是托管对象,您还需要创建要公开访问的属性(属性)。
    3. 不要将类添加到测试目标(如果这样做,则转换将失败)。
    4. 而是将import YourAppName添加到测试文件中。
    5. 使用无条件演员。
    6. 像这样[测试]:

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