Kotlin - Проверка внутренних сопрограмм с задержкой с использованием runBlockingTest - PullRequest
2 голосов
/ 20 февраля 2020

У меня есть этот фрагмент кода:

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.

  1. Если вызов занимает несколько миллисекунд, то loading.value = true никогда не будет вызван.
  2. Если вызов занимает несколько секунд, будет вызван loading.value = true.

Я хочу проверить функцию setBlocked().

Проблема этого кода в том, что я не знаю, как проверить эти два утверждения. Я знаю, что могу проверить код, используя delay() с runBlockingTest и advanceTimeBy(), но перед вызовом advanceTimeBy().

будет вызвана вещь loadingJob.cancel(). Как я могу это проверить? Если у вас есть предложения по изменению кода, чтобы сделать его тестируемым, я тоже буду рад его здесь.

Редактировать: заменить cancel() на cancelAndJoin(), как предлагает Марко Топольник.

...