Модульное тестирование асинхронных функций в swift - PullRequest
0 голосов
/ 08 июня 2018

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

1 Ответ

0 голосов
/ 08 июня 2018

Каков наилучший способ убедиться, что функция performLogin завершена до выполнения тестового примера?

В общем, лучший способ для вашего теста - вызов функция performLogin.Не используйте модульные тесты для запуска или тестирования поведения интерфейса.Протестируйте только бизнес-логику и выделите эту бизнес-логику таким образом, чтобы сделал тестируемым.

В вашем случае, однако, может оказаться, что все, что вы должны были написать здесь, всевместе с тем был тест пользовательского интерфейса, а не модульный тест.(Я не могу точно сказать, потому что я не знаю, что вы думаете об этой ситуации, это вообще должно быть проверяемым.)

...