首页 > 解决方案 > 单元测试协程通道返回

问题描述

我每隔几秒钟进行一次轮询并返回一个带有结果的通道。我的问题是如何测试它。

这是我的视图模型代码:

@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

标签: androidunit-testingcoroutinekotlin-coroutines

解决方案


推荐阅读