Привет @ Raghad ak , добро пожаловать в переполнение стека ?.
Ваше предположение о том, что время препятствует успешному прохождению теста, верно.
Сетевой код является асинхронным. После тестовых вызовов .sendActions(for: .touchUpInside)
на вашей кнопке входа в систему она переходит на следующую строку, не давая возможности обратного вызова выполнить.
Как и в ответе @ ajeferson , в долгосрочной перспективе я бы рекомендовал размещать ваши вызовы Alamofire за классом обслуживания или просто протоколом, чтобы вы могли заменить их на double в тестах.
Если вы не пишете интеграционные тесты, в которых вы будете тестировать поведение вашей системы в реальном мире, попадание в сеть может принести вам больше вреда, чем пользы. В этом посте более подробно рассказывается, почему это так.
Сказав все это, вот быстрый способ пройти тест. По сути, вам нужно найти способ заставить тест ждать своего завершения асинхронного кода, и вы можете сделать это с уточненным асинхронным ожиданием.
В вашем тесте вы можете сделать это:
expectation(
for: NSPredicate(
block: { input, _ -> Bool in
guard let label = input as? UILabel else { return false }
return label.text == "logged in successfully"
}
),
evaluatedWith: controllerUnderTest.lblValidationMessage,
handler: .none
)
controllerUnderTest.loginButton?.sendActions(for: .touchUpInside)
waitForExpectations(timeout: 10, handler: nil)
Это ожидание будет запускать NSPredicate
в цикле и выполняться только тогда, когда предикат вернет true
.