我试图对一个在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完成块:
完成:((Bool) - > Void)
但是因为它调用了完成:
RootViewController的?.present
我收到错误:
无法转换类型'((Bool) - > Void)的值?'预期的论点 输入'(() - > Void)?'
知道如何正确地测试功能吗?
答案 0 :(得分:0)
具有副作用的单元测试代码可能非常难,尤其是如果副作用涉及硬件,如设备屏幕。因此,UI组件不适合单元测试,因为它们通常涉及GPU操作。
现在,如果您真的想测试该组件,可以通过两种方式:
结论:对业务代码进行单元测试,并让QA测试UI的行为符合预期。
答案 1 :(得分:0)
尝试几种方法:
present(_, animated, completion)
来捕捉所呈现的内容。我为UIAlertControllers https://qualitycoding.org/testing-uialertcontroller/执行此操作,但这是因为UIAlertControllers非常常见。您的自定义窗口可能不值得。makeKeyAndVisible
和present
可能不会产生直接影响。相反,他们安排工作。因此,您可以尝试使用RunLoop.current.run(until: Date())
来运行运行循环。这适用于激活文本字段,但我不知道它是否适合您。waitForExpectations
以及超时。正如我在https://qualitycoding.org/asynchronous-tests/中所述,不要在期望处理程序中做任何断言。相反,捕获您想要的信息并fulfill
期望。然后断言你已捕获的内容。