单元测试在testes函数调用AppDelegate + managed Object时崩溃

时间:2015-02-13 17:36:35

标签: ios xcode unit-testing swift xctest

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

myCategoryFunction获取NSDictionary并将其内容映射到Categories [Category]列表并返回它。要进行映射我必须使用以下代码创建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
}

当我运行应用程序时,代码运行正常并按预期工作,但是当我运行此函数的单元测试时,它会崩溃。

1我收到以下错误:

AppDelegate error

发生在以下行:

let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)

当我继续执行程序时,它在获取managedObjectContext时崩溃,如下所示:

managedObjectContext Error - EXC_BAD_ACCESS

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

UIApplication.sharedApplication().delegate as AppDelegate causes EXC_BAD_ACCESS using it on swift unit test

但它不起作用。有没有人有一个有效的解决方案?

提前感谢,

2 个答案:

答案 0 :(得分:1)

当堆栈跟踪指示时,无条件转换(作为AppDelegate 的行)失败。您链接的问题包含此问题的解决方案。

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

要解决此问题,请按住Control +单击AppDelegate.swift并选择显示文件检查器,然后在目标会话下确保唯一的复选框位于应用程序旁边,并且您的单元测试包旁边没有检查。

enter image description here

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

答案 1 :(得分:0)

使用swift2,你不需要公开你的方法和课程,你可以使用,

@testable import {main module} 

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