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中的单元测试证明是一件令人头疼的问题
您无法添加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属性而不是更改隔离级别.查看本教程以了解具体方法.
| 归档时间: |
|
| 查看次数: |
3426 次 |
| 最近记录: |