Я пишу юнит-тесты для различных компонентов пользовательского интерфейса.Однако у меня возникают проблемы при написании тестов для кнопок, которые запускают асинхронные функции.Моя проблема в том, что я использую 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)
}
И функция, которая обрабатывает вход в систему, вызывая метод работника-избыточника:
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
завершила работу перед выполнением контрольного примера?