【发布时间】:2021-03-24 11:27:42
【问题描述】:
我有一个具有以下属性的 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 类扩展。
【问题讨论】:
-
这就是我在没有任何库的情况下测试热流的方式。 stackoverflow.com/a/68909180/2719243
标签: android unit-testing kotlin-coroutines kotlin-flow