Beim Testen mit Turbine kann nicht jede Emission von StateFlow erfasst werdenAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Beim Testen mit Turbine kann nicht jede Emission von StateFlow erfasst werden

Post by Anonymous »

Ich versuche meine Ansichtsmodelle zu testen, die einen öffentlichen StateFlow über den StateIn-Operator verfügbar machen:

Code: Select all

    private val _uiState: MutableStateFlow =
MutableStateFlow(createInitialState(savedStateHandle))

val uiState: StateFlow = _uiState
.onStart { onViewSubscribed() }
.stateIn(
scope = viewModelScope,
started = sharingStarted,
initialValue = _uiState.value
)

Ich verwende Turbine, um die Emissionen zu erfassen und auf sie anzuwenden
Das testet diese Funktion:

Code: Select all

    fun setStates() {
viewModelScope.launch {
updateStateFlow { copy(isLoading = true) }
updateStateFlow { copy(isLoading = false) }
updateStateFlow { copy(isLoading = true) }
updateStateFlow { copy(isLoading = false) }
updateStateFlow { copy(isLoading = true) }
}
}

Und ich überschreibe den Haupt-Dispatcher in Tests über diese JUnit5-Erweiterung:

Code: Select all

@ExperimentalCoroutinesApi
class MainDispatcherExtension(
private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher()
) : BeforeEachCallback, AfterEachCallback {
override fun beforeEach(context: ExtensionContext?) {
Dispatchers.setMain(testDispatcher)
}

override fun afterEach(context: ExtensionContext?) {
Dispatchers.resetMain()
}
}
Das Problem besteht darin, dass ich nicht jede einzelne Emission einzeln erfassen kann. Turbine löst die Ausnahme „Kein Wert wird in 3 Sekunden erzeugt“ aus (Eigentlich wird nur die letzte Emission erfasst, sodass die anderen, die auf eine Emission warten, natürlich eine Zeitüberschreitung verursachen.) Aber wenn ich eine Verzögerung zwischen den Emission hinzufüge, kann ich sie nach Belieben erfassen (separat und jede hat unterschiedliche Behauptungen):

Code: Select all

    fun setStates() {
viewModelScope.launch {
updateStateFlow { copy(isLoading = true) }
delay(1)
updateStateFlow { copy(isLoading = false) }
delay(1)
updateStateFlow { copy(isLoading = true) }
delay(1)
updateStateFlow { copy(isLoading = false) }
delay(1)
updateStateFlow { copy(isLoading = true) }
}
}
Aber wie Sie sehen, ändert dies den Produktcode, nur um ihn testen zu können, und das ist ekelhaft, keine praktikable Option.
Ich habe diesen Artikel über die „Verschmelzung“ von Stateflow gelesen und versucht, seine Lösung anzuwenden, indem ich meinen runTest-Dispatcher in StandardTestDispatcher geändert habe und daher würde Turbine laut Artikel in UnconfinedTestDispatcher sammeln und ich muss in der Lage sein, jede Emission außer ihr zu erfassen hat nicht funktioniert. Was ist der Grund? Können Sie mir das erklären? Vielleicht kann ich den Autor des Artikels markieren, um zu sehen, ob ich einen Teil davon falsch verstanden habe.
Bearbeiten: Hier ist das minimal reproduzierbare Repo.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post