【发布时间】:2021-09-16 19:11:37
【问题描述】:
我有一个视图模型,它接收一个初始的 ViewState 对象,并有一个可公开访问的 state 变量,可以收集。
class MyViewModel<ViewState>(initialState: ViewState) : ViewModel() {
val state: StateFlow<ViewState> = MutableStateFlow(initialState)
val errorFlow: SharedFlow<String> = MutableSharedFlow()
init {
performNetworkCall()
}
private fun performNetworkCall() = viewModelScope.launch {
Network.makeCall(
"/someEndpoint",
onSuccess = {
(state as MutableStateFlow).tryEmit(<some new state>)
},
onError = {
(errorFlow as MutableSharedFlow).tryEmit("network failure")
}
)
}
}
从片段中观察此状态时,我可以看到初始状态(例如正在加载),并在网络调用成功完成时收集更改(例如,进入加载状态。)
但是,我不知道如何从我的ViewModelUnitTest 观察到这种发射。
我使用 kotlin 涡轮机来测试我的状态和共享流的排放,但我只能观察到在我调用 viewModel.state.test 或 viewModel.errorFlow.test 之后发生的排放。
由于在 ViewModel 初始化之前我无法引用 viewModel.state 或 viewModel.errorFlow,我如何编写测试来验证我的初始化逻辑是否正确执行并根据 Network.makeCall 的模拟行为发出预期结果 -是state 的新发射还是errorFlow 发射?
【问题讨论】:
标签: android kotlin kotlin-coroutines android-viewmodel kotlin-flow