es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Verificando la navegación en pruebas de widgets de Flutter

Estoy implementando una prueba de widget en la que un usuario inicia sesión y es redirigido a la siguiente vista tras una autenticación exitosa. He revisado varios posts, todos los cuales sugieren configurar un simulacro de tipo NavigatorObserver y luego utilizarlo para verificar que se haya llevado a cabo la transición a la siguiente vista. En mi prueba de widget, he configurado el simulacro de la siguiente manera:

class MockNavigatorObserver extends Mock implements NavigatorObserver {}

Mi configuración instancia el simulacro de la siguiente manera:

final mockObserver = MockNavigatorObserver();

En mi función testWidgets, tengo lo siguiente:

await tester.pumpWidget(
  MultiProvider(
    providers: [
      ChangeNotifierProvider(create: (_) => SomeProvider()),
      ChangeNotifierProvider(create: (_) => SomeOtherProvider())
    ],
    child: MaterialApp(
      home: LoginView(),
      navigatorObservers: [mockObserver],
    )
  )
);

Este es el código que ejecuta el proceso de autenticación:

await tester.enterText(usernameTextField, 'nombreDeUsuario');
await tester.enterText(passwordTextField, 'contraseña');
await tester.pumpAndSettle();
await tester.tap(submitButtonFinder);
await tester.pumpAndSettle();
verify(mockObserver.didPush(any, any)); // provoca el fallo de compilación

Encontré varios posts que sugieren utilizar lo siguiente para verificar que se haya llevado a cabo la transición:

verify(mockObserver.didPush(any!, any));

Sin embargo, esto no se compila en mi código. El primer parámetro any en la llamada a verify no se compila y muestra el mensaje:

El tipo de argumento 'Null' no se puede asignar al tipo de parámetro 'Route<dynamic>'.

He verificado que el proceso de autenticación se inicia correctamente en la vista y que las credenciales se transmiten correctamente. Todas las pruebas pasan excepto la verificación de que la transición a la siguiente vista ocurrió.

¿Alguien sabe la forma correcta de verificar que se haya realizado la transición de ruta?

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Problema con verify en una prueba de widget utilizando un objeto simulado de NavigatorObserver

    Mientras se implementa una prueba de widget en la que un usuario inicia sesión y se navega a la siguiente vista después de una autenticación exitosa, se sugiere utilizar un objeto simulado de NavigatorObserver para verificar si la siguiente vista fue mostrada. El simulacro debe ser instanciado como MockNavigatorObserver() y se puede utilizar para verificar la navegación utilizando verify(mockObserver.didPush(any!, any));.

    Sin embargo, al intentar construir para la verificación, el tipo de argumento Null no puede asignarse al parámetro de tipo Route<dynamic>, lo que resulta en un error de compilación. Esto se puede observar en la imagen adjunta.

    Una solución a este error es reemplazar any! con isA<route>(), lo que resulta en verify(mockObserver.didPush(isA<route>(), any));. Esto funciona ya que el primer argumento de didPush es una instancia de Route.

    Esto debería permitir que la verificación de la navegación a la siguiente vista se complete exitosamente.

    await tester.pumpAndSettle();
    verify(mockObserver.didPush(isA<route>(), any));
    

    ¡Gracias!

Comments are closed.