У меня есть этот фрагмент кода:
fun setBlocked(blocked: Boolean) = viewModelScope.launchSafe(::handleExceptionsActive) {
/**
* Show loading after 500 ms to prevent from showing it if cloud functions are hot.
*/
val loadingJob = launch { delay(500L); _loading.value = true }
participantDataSource.setBlockedUser(contact.userId, blocked)
loadingJob.cancelAndJoin()
_loading.value = false
}
Он выполняет функцию облачной функции Firebase, которая может занять несколько секунд или всего несколько миллисекунд в зависимости от того, работает ли облачная функция или нет. Этот код запускает загрузку LiveData
на true
через 500 мс, а затем возвращает его на false
.
- Если вызов занимает несколько миллисекунд, то
loading.value = true
никогда не будет вызван. - Если вызов занимает несколько секунд, будет вызван
loading.value = true
.
Я хочу проверить функцию setBlocked()
.
Проблема этого кода в том, что я не знаю, как проверить эти два утверждения. Я знаю, что могу проверить код, используя delay()
с runBlockingTest
и advanceTimeBy()
, но перед вызовом advanceTimeBy()
.
будет вызвана вещь loadingJob.cancel()
. Как я могу это проверить? Если у вас есть предложения по изменению кода, чтобы сделать его тестируемым, я тоже буду рад его здесь.
Редактировать: заменить cancel()
на cancelAndJoin()
, как предлагает Марко Топольник.