gpt4 book ai didi

android - 在 ViewModel 初始化中观察 StateFlow 发射

转载 作者:行者123 更新时间:2023-12-04 23:45:12 27 4
gpt4 key购买 nike

我有一个 View 模型,它采用初始 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")
}
)
}
}
从 fragment 中观察此状态时,我可以看到初始状态(例如正在加载),并在网络调用成功完成时收集更改(例如,到加载状态。)
但是,我不知道如何从我的 ViewModelUnitTest 中观察到这种发射。 .
我使用 kotlin 涡轮机来测试我的状态和共享流的排放,但我只能观察到在我调用 viewModel.state.test 之后发生的排放。或 viewModel.errorFlow.test .
由于我无法引用 viewModel.stateviewModel.errorFlow在 ViewModel 初始化之前,如何编写测试来验证我的初始化逻辑是否正确执行并根据 Network.makeCall 的模拟行为发出预期结果- 是否是 state 的新排放或 errorFlow排放?

最佳答案

由于您的网络类在 View 模型中没有任何引用,因此无法模拟/伪造 Network类的行为。因此,为 Network 创建一个引用.捕捉 init 中发生的事情 block ,您可以在测试类中延迟初始化您的 View 模型。在 here 中有描述作为第二种方式。大致而言,您的类(class)类似于:

class MyViewModel<ViewState>(
initialState: ViewState,
network: Network
) : 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")
}
)
}
}
@ExperimentalCoroutinesApi
class MyViewModelTest {

@get:Rule
var coroutinesTestRule = CoroutinesTestRule()

val viewModel by lazy { MyViewModel(/*pass arguments*/) }
}
CoroutineTestRule可以在 here 中找到.

关于android - 在 ViewModel 初始化中观察 StateFlow 发射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69213929/

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