Модульное тестирование метода ViewModel, который использует ViewModelScope.launch для вызова функции приостановки с задержкой - PullRequest
0 голосов
/ 10 июля 2019

В моем ViewModel у меня есть метод onTextChanged, который вызывается через привязку данных на EditText. Там я использую viewModelScope.launch{}, чтобы запустить suspend функцию. В этой функции я задерживаюсь на 500 мс. Теперь, как мне проверить метод onTextChanged? Все, что я пробовал, всегда приводит к завершению теста до окончания задержки. Я пробовал с runBlockingTest, TestCoroutineDispatcher и runBlocking.

Наблюдатель:

override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
        searchJob = if (searchJob?.isActive == true) {
            searchJob?.cancel()
            viewModelScope.launch { search(s.toString()) }
        } else {
            viewModelScope.launch { search(s.toString()) }
        }
    }

Метод поиска:

 private suspend fun search(query: String) {
            delay(500)
            searchUseCase(SearchParams(query)).fold({

            }, {

            })
    }

Тест:

    @Test
    fun `Search is fired after 500ms when text is changed`()  = runBlockingTest {
        val viewModel = ViewModel(useCase)
        viewModel.onTextChanged("test", 0, 0, 0)

        //TODO assert time was 500ms or more

        //This fails
        coVerify(exactly = 1) { useCase.invoke(any()) }
    }
...