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

Forum für diejenigen, die für Android programmieren
Anonymous
 Wie richten wir diesen Kotlin Flow ein und sammeln auf demselben Dispatcher?

Post by Anonymous »

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 ?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post