Модульное тестирование Coroutine Channel return - PullRequest
0 голосов
/ 28 апреля 2020

Я делаю опрос каждые несколько секунд и возвращает канал с результатом. Моя проблема в том, как это проверить.

Вот мой код модели представления:

@ExperimentalCoroutinesApi
fun fetchInfo() {
    viewModelScope.launch {
        channel = fetchInfoUseCase("1")
        channel.consumeEach {
            viewAction.postValue(ViewAction.UPDATE)
        }
    }
}

Мой код модульного теста:

@ExperimentalCoroutinesApi
class MyViewModelTest {
    @get:Rule
    val instantTask = InstantTaskExecutorRule()

    @get:Rule
    val coroutinesTestRule = CoroutinesTestRule()

    private val fetchInfo = mockk<FetchInfoUseCase>()

    private val channel = Channel<Result<MyModel, MyError>>()

    private val viewModel = MyViewModel(fetchInfo)

    @Test
    fun dispatchFunction_viewActionUpdate() {
        prepareScenario()
        viewModel.fetchInfo()
        coVerify(exactly = 1) { fetchInfo(any()) }

        assertEquals(
            viewModel.viewAction.value,
            ViewAction.UPDATE
        )
    }

    private fun prepareScenario() {
        coEvery { fetchInfo(any()) } returns channel
    }
}

Мой в моем тесте, viewModel.viewAction.value всегда равно нулю. Как я могу проверить, что viewAction вызывается и значение равно ViewAction.UPDATE ?

...