从 XCTestCase 子类访问 App Delegate - 类型错误?
Accessing App Delegate from XCTestCase Subclass - Wrong Type?
我刚开始在 Xcode 中进行单元测试,所以我决定尝试一下使用 Xcode 的任何项目模板创建的默认测试目标。
作为开始,我决定执行一个非常基本的测试,看看 AppDelegate
实例的 window
属性(UIWindow?
类型)是否实际设置。
这是我的测试代码:
import UIKit
import XCTest
import Sample // This is the App target (app is called "Sample")
class SampleTests: XCTestCase
{
override func setUp(){
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown(){
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample(){
// This is an example of a functional test case.
if let delegate = UIApplication.sharedApplication().delegate{
if let myDelegate = delegate as? AppDelegate {
if let window = myDelegate.window {
XCTAssert(true, "Pass")
}
else{
XCTFail("App Delegate Has No Window")
}
}
else{
XCTFail("Application Delegate Object Is of The Wrong Type")
}
}
else{
XCTFail("Application Delegate Not Present")
}
}
}
起初,我无法构建测试目标,因为无法访问 AppDelegate class。我尝试了两种方法,结果不同:
如果我将我的 AppDelegate
class 及其所有 properties/methods 都标记为 public, 测试构建没有错误并成功 (即,window
可选不是 nil
)。
如果我将 AppDelegate 的 class、属性和方法标记为 internal
,但将源文件的目标成员资格修改为也属于测试目标(不是只是应用程序目标),测试构建没有错误但失败("Application Delegate Object Is of The Wrong Type",即条件转换为AppDelegate
类型失败).
看起来好像使用第二种方法,在运行时存在不同的应用程序委托。有人知道发生了什么事吗?
实际上,当您将 AppDelegate.swift 添加到测试目标成员时,project.But 中只有一个 App Delegate 文件,那么您的测试的 App Delegate Class 将不同于 AppDelegate class.
if let delegate = UIApplication.sharedApplication().delegate{
上面的 If
语句试图 returns 项目委托实例不同于您尝试 Cast.
if let myDelegate = delegate as? AppDelegate
因此转换为 AppDelegate
不会 succeed.So,你总是会失败,因为
XCTFail("Application Delegate Object Is of The Wrong Type")
更新:
我写了一些测试用例来了解确切的问题:
1)测试用例以确定 AppDelegate 是否为 nil。 (通过)
if let delegate = UIApplication.sharedApplication().delegate{
XCTAssertNotNil(delegate, "not nil")
2)所以,下一个测试在下面(失败)
XCTAssertNotNil(delegate as? AppDelegate, "not nil")
这个测试用例失败了..所以肯定是转换有问题。
我刚开始在 Xcode 中进行单元测试,所以我决定尝试一下使用 Xcode 的任何项目模板创建的默认测试目标。
作为开始,我决定执行一个非常基本的测试,看看 AppDelegate
实例的 window
属性(UIWindow?
类型)是否实际设置。
这是我的测试代码:
import UIKit
import XCTest
import Sample // This is the App target (app is called "Sample")
class SampleTests: XCTestCase
{
override func setUp(){
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown(){
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample(){
// This is an example of a functional test case.
if let delegate = UIApplication.sharedApplication().delegate{
if let myDelegate = delegate as? AppDelegate {
if let window = myDelegate.window {
XCTAssert(true, "Pass")
}
else{
XCTFail("App Delegate Has No Window")
}
}
else{
XCTFail("Application Delegate Object Is of The Wrong Type")
}
}
else{
XCTFail("Application Delegate Not Present")
}
}
}
起初,我无法构建测试目标,因为无法访问 AppDelegate class。我尝试了两种方法,结果不同:
如果我将我的
AppDelegate
class 及其所有 properties/methods 都标记为 public, 测试构建没有错误并成功 (即,window
可选不是nil
)。如果我将 AppDelegate 的 class、属性和方法标记为
internal
,但将源文件的目标成员资格修改为也属于测试目标(不是只是应用程序目标),测试构建没有错误但失败("Application Delegate Object Is of The Wrong Type",即条件转换为AppDelegate
类型失败).
看起来好像使用第二种方法,在运行时存在不同的应用程序委托。有人知道发生了什么事吗?
实际上,当您将 AppDelegate.swift 添加到测试目标成员时,project.But 中只有一个 App Delegate 文件,那么您的测试的 App Delegate Class 将不同于 AppDelegate class.
if let delegate = UIApplication.sharedApplication().delegate{
上面的 If
语句试图 returns 项目委托实例不同于您尝试 Cast.
if let myDelegate = delegate as? AppDelegate
因此转换为 AppDelegate
不会 succeed.So,你总是会失败,因为
XCTFail("Application Delegate Object Is of The Wrong Type")
更新:
我写了一些测试用例来了解确切的问题:
1)测试用例以确定 AppDelegate 是否为 nil。 (通过)
if let delegate = UIApplication.sharedApplication().delegate{
XCTAssertNotNil(delegate, "not nil")
2)所以,下一个测试在下面(失败)
XCTAssertNotNil(delegate as? AppDelegate, "not nil")
这个测试用例失败了..所以肯定是转换有问题。