从XCTestCase子类访问App Delegate - 错误的类型?

时间:2015-08-05 07:08:16

标签: ios swift xctest

我刚刚进入Xcode进行单元测试,所以我决定使用任何Xcode项目模板创建的默认测试目标。

首先,我决定执行一项非常基本的测试,以查看txtData实例AppDelegate属性(类型window)是否实际设置。

这是我的测试代码:

UIWindow?

起初,我无法构建测试目标,因为AppDelegate类无法访问。我尝试了两种方法,结果不同:

  1. 如果我将我的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)。

  2. 相反,如果我将AppDelegate的类,属性和方法标记为nil,则修改源文件的目标成员资格也属于测试目标(而不仅仅是应用程序目标) ),测试构建没有错误但是失败("应用程序委托对象属于错误类型",即条件转换为internal类型失败)。

  3. 看起来好像使用第二种方法,运行时会出现不同的应用程序委托。有人知道发生了什么吗?

1 个答案:

答案 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")

此测试用例失败。因此确定在投射中存在问题。