如何使用导航控制器对 Segue 进行单元测试
How to Unit test a Segue with NavigationalController is present
我正在尝试编写一个测试来使用 thenavigationController 检查 presentModally segue 是否被取消或存在。 MessageVC 是我想测试它是否存在或被驳回的模态。但是performSegue之后,topViewController并没有变成MessageVC。
联系故事板控制器(ContactViewController):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case "Message":
let navigationController = segue.destination as! UINavigationController
let messageVC = navigationController.topViewController as! MessageViewController
// Set the modal view controller to be the delegate of the presentationController for this presentation,
// so that modal view controller can respond to attempted dismissals
navigationController.presentationController?.delegate = messageVC
}
测试:
var messageVC = MessageViewController()
override func setUp() {
let storyboard = UIStoryboard(name: "Contact", bundle: Bundle.main)
let navigationController = storyboard.instantiateInitialViewController() as! UINavigationController
navigationController.topViewController.performSegue(withIdentifier: "Message", sender: self)
}
func testModalPresent() {
}
这很可能是因为您调用的是异步执行。它可能甚至没有机会在您的测试完成之前执行。
对于这种事情,你真的有两个选择:
使用 XCTest 异步预期更新您的测试,使其允许代码执行并等待预期结果。
将您的测试重写为 UI 测试。
任何一个都不会是直截了当的,将取决于您的技能,以决定它对您的效果如何。但是,如果您还不了解这两种技术,它们都值得学习。
测试期望将在许多异步情况下为您提供帮助 - 网络代码、异步 API(例如 promises、reactive 和 Apple 的 Combine)。
UI 测试将有助于确保您的应用按照用户的预期运行。
我正在尝试编写一个测试来使用 thenavigationController 检查 presentModally segue 是否被取消或存在。 MessageVC 是我想测试它是否存在或被驳回的模态。但是performSegue之后,topViewController并没有变成MessageVC。
联系故事板控制器(ContactViewController):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case "Message":
let navigationController = segue.destination as! UINavigationController
let messageVC = navigationController.topViewController as! MessageViewController
// Set the modal view controller to be the delegate of the presentationController for this presentation,
// so that modal view controller can respond to attempted dismissals
navigationController.presentationController?.delegate = messageVC
}
测试:
var messageVC = MessageViewController()
override func setUp() {
let storyboard = UIStoryboard(name: "Contact", bundle: Bundle.main)
let navigationController = storyboard.instantiateInitialViewController() as! UINavigationController
navigationController.topViewController.performSegue(withIdentifier: "Message", sender: self)
}
func testModalPresent() {
}
这很可能是因为您调用的是异步执行。它可能甚至没有机会在您的测试完成之前执行。
对于这种事情,你真的有两个选择:
使用 XCTest 异步预期更新您的测试,使其允许代码执行并等待预期结果。
将您的测试重写为 UI 测试。
任何一个都不会是直截了当的,将取决于您的技能,以决定它对您的效果如何。但是,如果您还不了解这两种技术,它们都值得学习。
测试期望将在许多异步情况下为您提供帮助 - 网络代码、异步 API(例如 promises、reactive 和 Apple 的 Combine)。
UI 测试将有助于确保您的应用按照用户的预期运行。