gpt4 book ai didi

swift - swift 中的单元测试异步函数

转载 作者:行者123 更新时间:2023-11-28 05:58:04 34 4
gpt4 key购买 nike

我正在为 UI 的各个组件编写单元测试。但是,我在为触发异步功能的按钮编写测试时遇到了麻烦。我的问题是我正在使用 UIButton.sendActions(for controlEvents: UIControlEvents) 触发按钮的按下,然后调用异步函数。

假设我有一个测试:

func testLoginToMainScene() {
loadView()
let queue = DispatchQueue(label: "LoginButtonPressed")

queue.sync {
view.loginButton.sendActions(for: .touchUpInside)
}

XCTAssertTrue(router.navigateToMainSceneCalled)
}

测试 LoginViewController 类中的以下代码:

@IBAction func loginButtonPressed(_ sender: AnyObject) {
hideKeyboard()
performLogin(email: emailTextField.text, password: passwordTextField.text)
}

还有一个通过调用 redux worker 的方法来处理登录的函数:

private func performLogin(email: String, password: String) {
let result = myReduxWorker.getStore().dispatch(newLoginAction(email: email, password: password)

if let promise = result as? Promise<[String: Any]> {
promise.done { json -> Void in
//Login was successful!
router.navigateToMainScene()
}
}

目前,测试失败是因为 XCTAssertTrue 测试在 performLogin 函数完成之前运行,因此在调用 navigateToMainScene 之前运行。我尝试使用 DispatchQueue,但是一旦 .touchUpInside 操作发送到按钮,.sync 中的代码块就完成了,测试函数继续运行 XCTAssertTrue 测试。

确保 performLogin 函数在执行测试用例之前已完成运行的最佳方法是什么?

最佳答案

What is the best way to ensure that the performLogin function has finished running before executing the test case?

一般来说,最好的方法是让您的测试调用 performLogin 函数。不要使用单元测试来触发或测试接口(interface)行为。仅测试业务逻辑,并以使其可测试的方式分离该业务逻辑。

但是,在您的情况下,您应该一直在此处编写的内容可能是 UI 测试,而不是单元测试。 (我真的不能说,因为我不知道你在想这种情况应该是可测试的是什么。)

关于swift - swift 中的单元测试异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50765560/

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