我刚刚进入Xcode进行单元测试,所以我决定使用任何Xcode项目模板创建的默认测试目标。
首先,我决定执行一项非常基本的测试,以查看txtData
实例AppDelegate
属性(类型window
)是否实际设置。
这是我的测试代码:
UIWindow?
起初,我无法构建测试目标,因为AppDelegate类无法访问。我尝试了两种方法,结果不同:
如果我将我的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
可选不是window
)。
相反,如果我将AppDelegate的类,属性和方法标记为nil
,则修改源文件的目标成员资格也属于测试目标(而不仅仅是应用程序目标) ),测试构建没有错误但是失败("应用程序委托对象属于错误类型",即条件转换为internal
类型失败)。
看起来好像使用第二种方法,运行时会出现不同的应用程序委托。有人知道发生了什么吗?
答案 0 :(得分:1)
实际上项目中只有一个App Delegate文件。但是当你将AppDelegate.swift添加到测试目标成员时,你的Test的App Delegate Class将与AppDelegate类不同。
if let delegate = UIApplication.sharedApplication().delegate{
上述If
语句尝试返回与您尝试强制转换不同的项目委托实例。
if let myDelegate = delegate as? AppDelegate
因此,施放到AppDelegate
不会成功。所以,你总是失败
XCTFail("Application Delegate Object Is of The Wrong Type")
<强>更新:强>
我写了一些测试用例来了解确切的问题:
1)测试用例以确定AppDelegate是否为零。 (通过)
if let delegate = UIApplication.sharedApplication().delegate{
XCTAssertNotNil(delegate, "not nil")
2)所以,接下来的测试是在(失败)
XCTAssertNotNil(delegate as? AppDelegate, "not nil")
此测试用例失败。因此确定在投射中存在问题。