当前位置:  开发笔记 > 编程语言 > 正文

XCTestCase:UIApplication.shared.keyWindow返回nil

如何解决《XCTestCase:UIApplication.shared.keyWindow返回nil》经验,为你挑选了1个好方法。

当我打电话

UIApplication.shared.keyWindow

要尝试在我的测试类中设置根视图控制器,键窗口将返回nil。为什么会这样呢?

这是我设置情节提要的方法:

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()

InsertWittyN.. 5

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

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代码,还请确保已填充视图。

我唯一需要将视图控制器分配给窗口的次数之一是在测试导航之类的东西时,我想断言由于某种动作,另一个视图控制器正在模态显示。



1> InsertWittyN..:

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

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代码,还请确保已填充视图。

我唯一需要将视图控制器分配给窗口的次数之一是在测试导航之类的东西时,我想断言由于某种动作,另一个视图控制器正在模态显示。

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有