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 ?
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]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 ?
[/code]