Saltar al contenido principal

Transición de las interfaces de prueba de canales de plataforma al paquete flutter_test

Las APIs relacionadas con el método setMockMessageHandler se han movido de package:flutter a package:flutter_test

Resumen

#

Los siguientes métodos han sido reemplazados por APIs en el paquete flutter_test:

  • BinaryMessenger.checkMessageHandler
  • BinaryMessenger.setMockMessageHandler
  • BinaryMessenger.checkMockMessageHandler
  • BasicMessageChannel.setMockMessageHandler
  • MethodChannel.checkMethodCallHandler
  • MethodChannel.setMockMethodCallHandler
  • MethodChannel.checkMockMethodCallHandler

El callback onPlatformMessage ya no es utilizado por el framework de Flutter.

Contexto

#

Como parte de una refactorización de la arquitectura de comunicación de complementos de bajo nivel, nos hemos movido de la lógica anterior de onPlatformMessage/handlePlatformMessage a un sistema de almacenamiento en búfer por canal implementado en el motor en la clase ChannelBuffers. Para mantener la compatibilidad con el código existente, la API existente BinaryMessenger.setMessageHandler ha sido refactorizada para usar la nueva API de ChannelBuffers.

Una diferencia entre la API de ChannelBuffers y la API anterior es que la nueva API es más consistente en su enfoque de la asincronía. Como efecto secundario, las APIs en torno al paso de mensajes son ahora completamente asíncronas.

Esto planteó un problema para la implementación de las APIs de prueba heredadas que, por razones históricas, se encontraban anteriormente en el paquete flutter. Dado que dependían de que la lógica subyacente fuera parcialmente síncrona, requerían una refactorización. Para evitar añadir aún más lógica de prueba en el paquete flutter, se tomó la decisión de mover esta lógica al paquete flutter_test.

Descripción del cambio

#

Específicamente, se vieron afectadas las siguientes APIs:

  • BinaryMessenger.checkMessageHandler: Obsoleto.
  • BinaryMessenger.setMockMessageHandler: Reemplazado por TestDefaultBinaryMessenger.setMockMessageHandler.
  • BinaryMessenger.checkMockMessageHandler: Reemplazado por TestDefaultBinaryMessenger.checkMockMessageHandler.
  • BasicMessageChannel.setMockMessageHandler: Reemplazado por TestDefaultBinaryMessenger.setMockDecodedMessageHandler.
  • MethodChannel.checkMethodCallHandler: Obsoleto.
  • MethodChannel.setMockMethodCallHandler: Reemplazado por TestDefaultBinaryMessenger.setMockMethodCallHandler.
  • MethodChannel.checkMockMethodCallHandler: Reemplazado por TestDefaultBinaryMessenger.checkMockMessageHandler.

Estos reemplazos solo están disponibles para el código que utiliza el nuevo TestDefaultBinaryMessengerBinding (como cualquier código que use testWidgets en una prueba de flutter_test). No existe un reemplazo para el código de producción que utilizaba estas APIs, ya que no estaban destinadas al uso en código de producción.

Las pruebas que usan checkMessageHandler no tienen equivalente en la nueva API, ya que el registro del manejador de mensajes se gestiona directamente por el objeto ChannelBuffers, el cual no expone el oyente actualmente registrado para un canal. (Las pruebas que verifican el registro de manejadores parecen ser raras).

El código que necesita migración puede experimentar errores como los siguientes:

  error - The method 'setMockMessageHandler' isn't defined for the type 'BinaryMessenger' at test/sensors_test.dart:64:8 - (undefined_method)

  error • The method 'setMockMethodCallHandler' isn't defined for the type 'MethodChannel' • test/widgets/editable_text_test.dart:5623:30 • undefined_method

[error] The method 'setMockMessageHandler' isn't defined for the type 'BasicMessageChannel' (test/material/feedback_test.dart:37:36)

Además, el callback onPlatformMessage, que anteriormente era interceptado por el framework para recibir mensajes de los complementos, ya no se utiliza (y se eliminará a su debido tiempo). Como resultado, llamar a este callback para inyectar mensajes en el framework ya no tiene ningún efecto.

Guía de migración

#

El paquete flutter_test proporciona algunos shims para que los usos de los métodos obsoletos setMock... y checkMock... sigan funcionando. Las pruebas que anteriormente no importaban package:flutter_test/flutter_test.dart pueden hacerlo para habilitar estos shims; esto debería ser suficiente para migrar la mayor parte del código.

Sin embargo, estas APIs de shim están obsoletas. En su lugar, en el código que utiliza WidgetTester (por ejemplo, usando testWidgets), se recomienda utilizar los siguientes patrones para reemplazar las llamadas a esos métodos (donde tester es la instancia de WidgetTester):

dart
// old code
ServicesBinding.defaultBinaryMessenger.setMockMessageHandler(...);
ServicesBinding.defaultBinaryMessenger.checkMockMessageHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMessageHandler(...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(...);
dart
// old code
myChannel.setMockMessageHandler(...);
myChannel.checkMockMessageHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockDecodedMessageHandler(myChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myChannel, ...);
dart
// old code
myMethodChannel.setMockMethodCallHandler(...);
myMethodChannel.checkMockMethodCallHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(myMethodChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myMethodChannel, ...);

Las pruebas que usan package:test y test() se pueden cambiar para usar package:flutter_test y testWidgets() para obtener acceso a un WidgetTester.

El código que no tiene acceso a un WidgetTester puede hacer referencia a TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger en lugar de tester.binding.defaultBinaryMessenger.

Las pruebas que no utilizan la vinculación de widgets de prueba predeterminada (AutomatedTestWidgetsFlutterBinding, que se inicializa mediante testWidgets) pueden mezclar el mixin TestDefaultBinaryMessengerBinding en su vinculación para obtener los mismos resultados.

Las pruebas que manipulan onPlatformMessage ya no funcionarán como se diseñaron. Para enviar mensajes simulados al framework, considera usar ChannelBuffers.push. No existe un mecanismo para interceptar mensajes de los complementos y reenviarlos al framework en la nueva API. Si tu caso de uso requiere dicho mecanismo, por favor presenta un reporte de error.

Timeline

#

Introducido en la versión: 2.3.0-17.0.pre.1
En la versión estable: 2.5

Referencias

#

Documentación de la API:

PR relevante: