【问题标题】:Unit test, to test if a view controller has presented another view controller单元测试,测试一个视图控制器是否已经呈现了另一个视图控制器
【发布时间】:2021-06-18 23:21:52
【问题描述】:

我想做一个单元测试,看看一个视图控制器是否正在呈现另一个视图控制器。

   func testMainTabController_WhenActionButtonIsTapped_NewSuppliersInvoiceControllerIsCreatedV2() {
        
        let sut = MainTabBarController()
        sut.loadViewIfNeeded()
        let myExpectation = expectation(description: "The sut should present a view controller")
        sut.actionButton.sendActions(for: .touchUpInside)

        if let x = sut.presentedViewController {
            myExpectation.fulfill()
        } else {
            XCTFail("The view controller was not presented")
        }
        
        wait(for: [myExpectation], timeout: 3)
    }

这里我得到的结果是失败测试。因为我作为presentedViewController得到了nil。这是按钮的代码

@objc func handleActionButtonTap() {
    let suppliersInvoiceController = SuppliersInvoiceController()
    let navCon = UINavigationController(rootViewController: suppliersInvoiceController)
    navCon.modalPresentationStyle = .fullScreen
    present(navCon, animated: true, completion: nil)
}

这是我在测试中写的代码。当我运行单元测试并调用本方法时,按钮中的代码被成功调用。当然,如果我运行该应用程序,它可以正常工作。 当我点击按钮时,我得到了呈现的视图控制器。 如果我在 handleActionButtonTap() 和 print(vc) 中键入 let vc = presentViewController,我会得到导航控制。但是为什么我不能在单元测试里面做呢?

有人知道发生了什么吗?

谢谢

【问题讨论】:

    标签: ios swift xcode unit-testing


    【解决方案1】:

    你的 viewController 是否有足够的上下文让 presentViewController:animated: 工作?例如,它没有窗户。 PresentViewController:animated: 在“水平规则环境”等中做不同的事情。

    如果您想进行单元测试,如何将 VC 更改为不直接从其自身呈现其他 VC,而是让它调用一个方法,例如一个可以模拟的协调器对象,然后断言模拟版本的 'present:animated:' 会按预期调用。

    【讨论】:

      【解决方案2】:

      你想做的是UITest而不是UnitTest

      什么是单元测试? https://x-team.com/blog/how-to-get-started-with-ios-unit-tests-in-swift/

      单元测试是你编写的一个函数,用于测试你的 应用程序。一个好的单元测试很小。它只单独测试一件事。 例如,如果您的应用将用户的总时间加起来 花了做某事,你可能会写一个测试来检查这个总数 是正确的。


      所以回到答案,为此进行 UI 测试。这是在 google 搜索后进行 UI 测试的示例备忘单:https://github.com/joemasilotti/UI-Testing-Cheat-Sheet

      在 UI 测试中,您将能够检查在点击按钮或其他内容后是否按下或呈现屏幕,例如:

      XCTAssert(app.staticTexts["Some Static String From SuppliersInvoiceController "].exists)
      

      【讨论】:

      • 谢谢,我知道,但我想做一个工作,让它工作。无论如何,非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2019-09-11
      相关资源
      最近更新 更多