【问题标题】:Unit test when the rootViewController presents a view?rootViewController 呈现视图时的单元测试?
【发布时间】:2018-07-27 19:19:55
【问题描述】:

我正在尝试对一个在 viewController 之外呈现视图的函数进行单元测试:

public func presentInOwnWindow(animated: Bool, completion: (() -> Void)?) {
        let alertWindow = UIWindow(frame: UIScreen.main.bounds)
        alertWindow.rootViewController = UIViewController()
        alertWindow.windowLevel = UIWindowLevelAlert + 1;
        alertWindow.makeKeyAndVisible()
    alertWindow.rootViewController?.present(self, animated: animated, completion: completion)
    }

到目前为止,我能想到的如何对它进行单元测试是这样的:

  func test_presentInOwnWindow () {

       let presented = sut.presentInOwnWindow(animated: true) {}

        XCTAssertNotNil(presented)
    }

我尝试为完成块传递一个布尔值:

完成:((Bool) -> Void)

但是因为它调用了完成:

rootViewController?.present

我得到错误:

无法转换“((Bool) -> Void)?”类型的值?到预期的论点 输入'(() -> Void)?'

知道如何正确地对函数进行单元测试吗?

【问题讨论】:

    标签: ios swift xctest presentviewcontroller rootviewcontroller


    【解决方案1】:

    具有副作用的单元测试代码可能非常困难,尤其是当副作用涉及硬件时,例如设备屏幕。由于这个原因,UI 组件不适合单元测试,因为它们通常涉及 GPU 操作。

    现在,如果你真的想测试组件,你可以走两条路:

    • 您编写快照测试
    • 您将所有业务逻辑提取到专用类中并对其进行测试。

    结论:对业务代码进行单元测试,让 QA 测试 UI 是否符合预期。

    【讨论】:

      【解决方案2】:

      尝试几个选项:

      1. 调整 UIViewController 的 present(_, animated, completion) 以捕获呈现的内容。我为 UIAlertControllers https://qualitycoding.org/testing-uialertcontroller/ 这样做,但那是因为 UIAlertControllers 很常见。您的自定义窗口可能不值得麻烦。
      2. 不确定这是否可行。 makeKeyAndVisiblepresent 可能不会立即产生影响。相反,他们安排工作。因此,您可以尝试使用RunLoop.current.run(until: Date()) 泵送运行循环。这适用于激活文本字段,但我不知道它是否适合您。
      3. 同样,尝试添加 XCTestExpectation 和 waitForExpectations 并设置一个小超时值。正如我在https://qualitycoding.org/asynchronous-tests/ 中指出的,不要在期望处理程序中做任何断言。相反,捕获您想要的信息和fulfill 期望。然后针对你所捕获的内容进行断言。
      4. 更改您编写的代码以使其更易于测试。通过调用保存在 SUT 的属性中的块来替换最后一行。为了测试,更换这个块。测试块可以调用完成处理程序,这为您提供了一种测试处理程序的方法。
      5. 手动测试此代码以使您满意。然后对其进行模拟,以便您的测试检查是否调用了此方法(但实际上并未调用它)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        相关资源
        最近更新 更多