Ios 当被测函数调用AppDelegate+;管理对象

Ios 当被测函数调用AppDelegate+;管理对象,ios,xcode,unit-testing,swift,xctest,Ios,Xcode,Unit Testing,Swift,Xctest,我有以下问题: 我正在用swift编写一个应用程序。我有一个托管对象(称为Category)的类函数(mapCategories),我想对其进行单元测试(XCTest) myCategoryFunction获取NSDictionary并将其内容映射到类别列表[Category],然后返回它。要进行映射,我必须使用以下代码创建类别对象: class func mapCategories(myDictionary: NSDictionary!) -> [Category]{

我有以下问题: 我正在用swift编写一个应用程序。我有一个托管对象(称为Category)的类函数(mapCategories),我想对其进行单元测试(XCTest)

myCategoryFunction获取NSDictionary并将其内容映射到类别列表[Category],然后返回它。要进行映射,我必须使用以下代码创建类别对象:

    class func mapCategories(myDictionary: NSDictionary!) -> [Category]{
        var categories: [Category] = []
        /* 
              ... some code here.
       */       
                let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)

                let managedObjectContext = appDelegate.managedObjectContext
                let entityDescription = NSEntityDescription.entityForName("Category", inManagedObjectContext: managedObjectContext!)
                var category = Category(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext!)
      /* 
             ... some code here.
      */       
       return Categories
}
当我运行应用程序时,代码运行良好并按预期工作,但当我运行此函数的单元测试时,它崩溃了

首先,我得到以下错误:

发生在以下行中:

let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
当我继续执行程序时,它在获取managedObjectContext时崩溃,如下所示:

我试图找到解决方案或解决办法,并尝试了以下方法:

但它不起作用。有人有有效的解决方案吗


提前感谢,

如堆栈跟踪所示,无条件强制转换(带有As-AppDelegate的行)失败。您链接到的问题包含此问题的解决方案

我猜它对您不起作用的原因是您忘记从单元测试包目标中删除AppDelegate.swift。假设您忘记了,您现在有两个AppDelegate定义:一个在单元测试包中,另一个在应用程序包中。无条件强制转换失败,因为您试图将应用程序中定义的AppDelegate强制转换为单元测试包中定义的AppDelegate

要解决此问题,Control+单击AppDelegate.swift并选择ShowFile Inspector,然后确保在Target Membership下,唯一的复选框位于应用程序旁边,而单元测试包旁边没有复选框


您在托管对象上下文中看到的第二个问题只是第一个问题的结果。

使用swift2,您不需要将方法和类公开,您可以使用

@testable import {main module} 

唯一需要注意的是,您需要将主机应用程序属性指向主应用程序包,并在测试目标生成设置下切换
Enable Testability=Yes

找到解决方案了吗?我遇到了同样的问题…不,我没有:(,这就是为什么我给这个问题增加了一个悬赏,你把所有的CoreData模型都添加到你的测试包中了吗?是的,它没有解决问题。它最终成功了,但我必须将我想要进行单元测试的所有方法和类都设置为公共的,这不是一个好的解决方案,我会暂时这样做,直到找到更好的解决方案。