如何使用导航控制器对 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() {
}

这很可能是因为您调用的是异步执行。它可能甚至没有机会在您的测试完成之前执行。

对于这种事情,你真的有两个选择:

  1. 使用 XCTest 异步预期更新您的测试,使其允许代码执行并等待预期结果。

  2. 将您的测试重写为 UI 测试。

任何一个都不会是直截了当的,将取决于您的技能,以决定它对您的效果如何。但是,如果您还不了解这两种技术,它们都值得学习。

测试期望将在许多异步情况下为您提供帮助 - 网络代码、异步 API(例如 promises、reactive 和 Apple 的 Combine)。

UI 测试将有助于确保您的应用按照用户的预期运行。