无法访问XCTestCase对象中的AppDelegate(或任何引用它的东西)

我试图在我的swift iOS应用程序上开始unit testing,但已经跑到总路障。 我似乎无法访问任何使用我的appDelegate。

我的appDelegate有一个UserController对象,它存储和pipe理login的用户和它的各种数据。 为了简化调用userController我创build了一个NSObject的自定义子类,这是我的所有模型类的子类。 它有它

 let userController : UserController = (UIApplication.sharedApplication().delegate as! AppDelegate).userController 

每当我尝试和testing一个子类化模型时,这行会导致一个SIGABRTexception。

无法将types“MyProject.AppDelegate”的值转换为“MyProjectionTests.AppDelegate”。

我试图从testing目标中删除AppDelegate,但是这样就给我AppDelegate是未定义的。 我已经尝试添加import MyProject到testing文件的顶部,但也没有工作。

我看到了另外两个解决scheme:

  • 使应用程序委托function私人 – 我真的不喜欢做这样的事情。 如果我不得不为了testing而更改我的代码,那么testing的意义何在?

  • 实现一个testing应用程序的委托,并使用它 – 如果我不testing项目中的什么,testing的重点又是什么。

有没有人有办法解决吗。 Swift的unit testing被certificate是令人头痛的事情,因为RSpec在rails上有多容易

您不能将AppDelegate.swift添加到testing目标。 这导致类也被创build在testing目标名称空间,它将是重复的。

如果AppDelegate对象在testing目标上解包时失败,因为该对象属于在主目标上定义的AppDelegate类的版本,但是代码试图展开对象,就好像它属于testing上定义的版本目标。

什么是需要的是使主目标有一个模块,所以他的所有类都可以导入到testing代码,就像任何工具包。

要将主目标定义为模块,请执行以下操作 在这里输入图像说明

然后导入模块,并访问该对象是这样的:

 import UIKit import XCTest import MyApp class MyAppTests: XCTestCase { func testExample() { let userController : UserController = (UIApplication.sharedApplication().delegate as! AppDelegate).userController //or explicitly referencing the module let userController : MyApp.UserController = (UIApplication.sharedApplication().delegate as! AppDelegate).userController } } 

}

AppDelegate和属性userController必须公开。 如果你已经在使用Swift 2.0,你可以使用可testing的属性,而不是改变隔离级别。 检查这个教程看看如何。