Wie richten wir diesen Kotlin Flow ein und sammeln auf demselben Dispatcher?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Wie richten wir diesen Kotlin Flow ein und sammeln auf demselben Dispatcher?

by Anonymous » 18 Mar 2025, 17:14

Ich habe versucht, einen IO -Aufruf zu testen, der über einen Fluss getätigt wird. Ich gibt mir einfach die Liste der Daten zurück.

Code: Select all

private val _isLoading = MutableStateFlow(false)
val isLoading :StateFlow  = _isLoading.asStateFlow()

fun fetchDeviceInfo(){
currentJob?.cancel()
currentJob =viewModelScope.launch {
repository.fetchTrackerData()
.flowOn(Dispatchers.IO)// this is used to make emit on IO
.catch { e->
_isLoading.emit(false)
_isError.emit(true)
}
.collect{data->
withContext(Dispatchers.IO) {
when (data) {
is TrackerState.Error -> {
_isError.emit(true)
_isLoading.emit(false)
}

is TrackerState.Loading -> {
_isLoading.emit(true)
}

is TrackerState.Success -> {
_isError.emit(false)

_listData.emit(data.data)
_isLoading.emit(false)
}
}
}

}

}
}
< /code>
Dies ist mein fakerepository, mit dem ich Daten zu < /p>
 emittiert habe
suspend fun  emit(value:TrackerState) = flow{
emit(value)
}

override suspend fun fetchTrackerData()=flow
< /code>
Dies ist meine Testfunktion, ich habe Mockito hier nicht verwendet < /p>
    fun `fetchDeviceInfo should update Loading`()= runTest {
viewModel.fetchDeviceInfo()//collector of flow
repository.emit(TrackerState.Loading())// our fake emitter
advanceUntilIdle()
assert(viewModel.isLoading.value)
}```

i then tried adding advanceUntileIdle after seeing that collect itself is a suspend function so take time to setup

`@Test
fun `fetchDeviceInfo should update Loading`()= runTest {
viewModel.fetchDeviceInfo()//collector of flow
advanceUntilIdle()
repository.emit(TrackerState.Loading())// our fake emitter
advanceUntilIdle()
assert(viewModel.isLoading.value)
}`

this fixed my issued but still why do i use advanceUntilIdle() again ?

Top