单元测试,用于测试一个视图控制器是否已经呈现了另一个视图控制器。

3
我想编写一个单元测试来查看一个视图控制器是否正在展示另一个视图控制器。
   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)
    }

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

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

这是我在测试中编写的代码。当我运行单元测试并调用present方法时,按钮中的代码成功被调用。当然,如果我运行应用程序,它也能正常工作。 当我点击按钮时,我会得到我的已呈现视图控制器。 如果我在handleActionButtonTap()内部键入let vc = presentedViewController,并打印(vc),则会得到导航控制器作为结果。但为什么我不能在单元测试中这样做呢?
有人知道发生了什么吗?
谢谢
2个回答

6
你想要做的是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)

谢谢,我知道,但是我想找个解决办法让它能够运行。不管怎样,非常感谢。 - undefined

2

您的viewController是否有足够的上下文来使presentViewController:animated:正常工作?例如,它没有窗口。在“水平规则环境”中,PresentViewController:animated:会执行不同的操作等。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接