В моем 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()) }
}