web-dev-qa-db-fra.com

Comment tester un appareil sur lequel une mutableduedflow <t> (replay = 0) a émis une valeur?

Je ne suis pas capable de comprendre comment tester cela un SharedFlow avec replay=0 émis une valeur.

import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.runBlocking
import org.junit.Test

class ShowcaseTest {

    @Test
    fun testIntSharedFlowFlow() {
        val intSharedFlow = MutableSharedFlow<Int>()

        runBlocking {
            intSharedFlow.emit(1)
        }
        
        // Does not work as there is no buffer because MutableSharedFlow(replay=0)
        assert(intSharedFlow.replayCache.first() == 1)
    }
}
9
Víctor Albertos

Si vous souhaitez tester avec Replay = 1, vous pouvez essayer d'émettre avant "Observer/collecter", alors avant le début du travail.

@Test
fun testIntSharedFlowFlow() = runBlockingTest{
    val _intSharedFlow = MutableSharedFlow<Int>()
    val intSharedFlow: SharedFlow = _intSharedFlow
    val testResults = mutableListOf<Int>()

    val job = launch {
        intSharedFlow.toList(testResults)
    }
    _intSharedFlow.emit(5) 
    
    assertEquals(1, testResults.size)
    assertEquals(5, testResults.first())
    job.cancel()
}

N'oubliez pas d'annuler le travail, le bouton SharedFlow continuera de collecter et le test vous donnera une erreur ou même une boucle pour toujours.

4
Javier Antón

Vous pouvez utiliser trymit () au lieu et vérifiez le résultat renvoyé

Mise à jour:

Pensez à utiliser Turbine pour ex:

sharedFlow.test {
    sharedFlow.emit(1)
    assertEquals(expected = 1, expectItem())
    cancelAndIgnoreRemainingEvents()

}
2
Róbert Nagy