首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XCTestCase: UIApplication.shared.keyWindow返回nil

XCTestCase: UIApplication.shared.keyWindow返回nil
EN

Stack Overflow用户
提问于 2017-01-26 03:31:19
回答 2查看 3.6K关注 0票数 8

当我打电话的时候

UIApplication.shared.keyWindow

为了尝试在我的测试类中设置根视图控制器,key窗口返回nil。为什么会发生这种情况?

下面是我如何设置我的故事板:

代码语言:javascript
复制
let testBoard = UIStoryboard(name: "TestStoryboard", bundle: Bundle(for: type(of: self)))
let vc = testBoard.instantiateViewController(withIdentifier: "TestController")

UIApplication.shared.keyWindow?.rootViewController = vc

_ = vc.view
vc.viewDidLoad()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-26 03:46:31

创建一个窗口并分配视图控制器。

代码语言:javascript
复制
let testBoard = UIStoryboard(name: "TestStoryboard", bundle: Bundle(for: type(of: self)))
let vc = testBoard.instantiateViewController(withIdentifier: "TestController")

let window = UIWindow()
window.rootViewController = vc
window.makeKeyAndVisible()

vc.view.layoutIfNeeded()

// Add test here

我注意到在那之后您还调用了vc.viewviewDidLoad。我建议只访问视图来加载它,而不是隐式地调用viewDidLoad --我个人使用vc.view.layoutIfNeeded()

根据您实际需要测试的内容,对我来说,很少需要将视图控制器分配给窗口本身。通常,您只需创建视图控制器的一个实例,并且如果您正在测试任何UI代码,还可以确保视图已被填充。

我需要将视图控制器分配给窗口的唯一一次是在测试导航之类的东西时,我想断言由于某些操作,另一个视图控制器正在以模态的方式呈现。

票数 9
EN

Stack Overflow用户

发布于 2018-12-29 22:58:00

当我在库中测试UI时,我遇到了类似的问题,该库需要访问真正的UIWindow,但没有自己的测试应用程序。

我的解决方法是添加一个虚拟的iOS单视图目标,然后将其分配为单元测试主机应用程序。

当然,这为您的测试代码提供了一个带有委托和窗口的UIApplication单例。

代码语言:javascript
复制
import XCTest
import UIKit

class ExampleTestCase: XCTestCase {
    var rootViewController: UIViewController!

    override func setUp() {
        guard let mainWindow = UIApplication.shared.delegate?.window,
            let window = mainWindow else {
                fatalError("Unable to find window")
        }
        rootViewController = UIViewController()
        window.rootViewController = rootViewController

        setupView()

        window.makeKeyAndVisible()
        RunLoop.current.run(until: Date())
    }
    func setupView() {
        rootViewController.view.backgroundColor = .red
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        label.text = "Hello!"
        label.textColor = .white
        label.font = UIFont.systemFont(ofSize: 25)
        //Do something with window
        rootViewController.view.addSubview(label)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.centerXAnchor.constraint(equalTo: label.superview!.centerXAnchor).isActive = true
        label.centerYAnchor.constraint(equalTo: label.superview!.centerYAnchor).isActive = true
    }

    func testExample() {
        print("Im a useless test!")
    }
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41860082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档