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

And*_*yan 3 xcode ios xctest swift

我正在尝试在我的swift iOS应用程序上开始单元测试,但已经进入了一个完整的路障.我似乎无法访问任何使用我的appDelegate的东西.

我的appDelegate有一个UserController对象,用于存储和管理登录用户以及它的各种数据.为了简化调用,userController我创建了一个自定义子类,NSObject其中所有的模型类都是子类.它有它

let userController : UserController = (UIApplication.sharedApplication().delegate as! AppDelegate).userController
Run Code Online (Sandbox Code Playgroud)

每当我尝试测试其中一个子类模型时,此行会导致SIGABRT异常.

无法将"MyProject.AppDelegate"类型的值转换为"MyProjectionTests.AppDelegate".

我试过从测试目标中删除AppDelegate,但这给了我AppDelegate是未定义的.我已经尝试添加import MyProject到测试文件的顶部,但这也不起作用.

我见过另外两个解决方案:

  • 使应用程序委托函数私有 - 我真的厌恶做这样的事情.如果我必须专门为测试更改我的代码,测试的重点是什么.

  • 实现一个测试应用程序委托并使用它 - 如果我没有在项目中测试什么,再次讨论测试的重点.

有没有人有办法解决吗.在RSpec与轨道之间的协调之后,Swift中的单元测试证明是一件令人头疼的问题

Mig*_*Slv 6

您无法添加AppDelegate.swift到测试目标.这导致在测试目标命名空间也创建类,它将是重复的.

如果AppDelegate对象在测试目标上展开,如果失败,因为该对象属于AppDelegate主目标上定义的类的版本,但是代码正在尝试解包该对象,就好像它属于测试目标上定义的版本一样.

需要的是启用主目标有一个模块,这样他的所有类都可以像任何工具包一样导入到测试代码中.

要将主目标定义为模块执行此操作: 在此输入图像描述

然后导入模块并访问对象,如下所示:

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 
    }
}
Run Code Online (Sandbox Code Playgroud)

}

AppDelegate和财产userController必须公开.如果您已经在使用Swift 2.0,则可以使用testable属性而不是更改隔离级别.查看教程以了解具体方法.