从 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。我尝试了两种方法,结果不同:

  1. 如果我将我的 AppDelegate class 及其所有 properties/methods 都标记为 public, 测试构建没有错误并成功 (即,window 可选不是 nil)。

  2. 如果我将 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")

这个测试用例失败了..所以肯定是转换有问题。