gpt4 book ai didi

android - 如何在 Android 上对 SharedFlow 进行单元测试

转载 作者:行者123 更新时间:2023-12-05 00:13:16 28 4
gpt4 key购买 nike

我有一个具有以下属性的 android viewmodel 类

private val _trainingNavigationEvents = MutableSharedFlow<NavigationEventTraining>(replay = 0)
val trainingNavigationEvents = _trainingNavigationEvents.asSharedFlow()

fun navigate(navigationEvent: NavigationEventTraining) {
viewModelScope.launch {
_trainingNavigationEvents.emit(navigationEvent)
}
}

我正在使用 SharedFlow,因为它解决了 SingleLiveEvent 问题。

当我尝试对代码进行单元测试时出现问题。我看不出如何使用涡轮机(或提供的原语)让它工作。

    @ExperimentalTime
@Test
fun `navigate`() = runBlockingTest {
viewModel.handleIntent(TrainingViewModel.TrainingIntent.ShowQuestions)

viewModel.navigationEvents.test {
assertEquals(
TrainingViewModel.TrainingNavigationEvent.NavigateToQuestions::class,
expectItem()::class
)
cancelAndConsumeRemainingEvents()
}
}

我明白了

kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 1000 ms

我知道 SharedFlow 永远不会完成,这可能是部分原因,但我一直无法找到任何示例来说明如何执行此操作。

我正在使用 Junit 5 并使用 TestCoroutineDispatcher 类扩展。

最佳答案

在 Turbine 的文档中有一个 Hot Flows部分,我认为我们可以做这样的事情:

@ExperimentalTime
@Test
fun `navigate`() = runBlockingTest {
viewModel.navigationEvents.test {
viewModel.handleIntent(TrainingViewModel.TrainingIntent.ShowQuestions)
assertEquals(
TrainingViewModel.TrainingNavigationEvent.NavigateToQuestions::class,
expectItem()::class
)
cancelAndConsumeRemainingEvents()
}
}

几乎将触发器移动到 Turbine 的 .test { block 中

关于android - 如何在 Android 上对 SharedFlow 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66780072/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com