Testing de flows en ViewModel con Turbine

Clase 10 de 16Curso de Android Testing

Resumen

Dominar la prueba de flows en un ViewModel es esencial para verificar que los estados se emiten en el orden correcto. Con la librería Turbine, podrás capturar y validar de manera efectiva cada emisión durante un test. Aprende cómo funciona el método awaitItem y valida distintos estados, como loading, datos cargados o errores, asegurando la fiabilidad de tus tests.

¿Qué ventajas ofrece Turbine en los tests de ViewModel?

Turbine simplifica notablemente las pruebas con flows, permitiendo validar cada valor emitido ordenadamente. Algunas ventajas claras de utilizar esta herramienta son:

  • Captura secuencial de emisiones usando la función awaitItem.
  • Validación efectiva de flujos con varios estados (por ejemplo, carga y datos).
  • Opciones de manejo como cancelar y descartar eventos pendientes (cancel and ignore remaining events).

¿Cómo implementar Turbine en tus pruebas?

Aplicar Turbine en tus tests es sencillo. A continuación, te mostramos cómo evaluar un estado inicial, un estado intermedio y un estado final usando la función awaitItem:

  1. Estado inicial: Valida el valor inicial del ViewModel.
val initialState = awaitItem()
assertThat(initialState.isLoading).isFalse()
  1. Estado de carga: Tras invocar tu operación (como cargar un perfil), asegúrate de capturar un estado intermedio de carga activa:
viewModel.loadProfile()

val loadingState = awaitItem()
assertThat(loadingState.isLoading).isTrue()
  1. Estado final: Verifica el estado final obtenido desde tu repositorio, incluyendo los datos esperados:
val loadedState = awaitItem()
assertThat(loadedState.isLoading).isFalse()
assertThat(loadedState.profile).isEqualTo(repository.profileToReturn)

Esto asegura manejar cada estado emitido en la prueba, evitando así errores por emisiones no consumidas.

¿Qué hacer si no deseas procesar todas las emisiones?

Al realizar pruebas, puede suceder que solo quieras contemplar determinados estados. Para estos casos, Turbine aporta métodos como:

  • cancel and ignore remaining events, para descartar el resto de eventos sin validarlos.
  • cancel and consume remaining events, para consumirlos aunque no los uses posteriormente.

Esto permite flexibilidad y claridad en tus pruebas sin caer en errores de emisiones pendientes no procesadas.

¿Cómo preparar tus tests para situaciones reales?

Aunque validar flujos simulados esté claro, también es importante verificar cómo actúa tu aplicación en escenarios reales, como respuestas HTTP. Para ello, herramientas complementarias como Mock Web Server son útiles:

  • Simula distintas respuestas HTTP reales.
  • Permite probar comportamientos ante situaciones de red como lentitud o errores.

En la siguiente oportunidad conocerás más sobre su potencial y aplicación práctica en tus pruebas.