gpt4 book ai didi

ios - rootViewController 呈现 View 时进行单元测试?

转载 作者:行者123 更新时间:2023-11-30 11:45:52 24 4
gpt4 key购买 nike

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

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)
}

我尝试为完成 block 传递一个 bool 值:

completion: ((Bool) -> Void)

但由于它调用完成:

rootViewController?.present

我收到错误:

Cannot convert value of type '((Bool) -> Void)?' to expected argument type '(() -> Void)?'

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

最佳答案

可以尝试的几个选项:

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

关于ios - rootViewController 呈现 View 时进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com