Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Teste de fluxo com Mock e Firebase Authentication

Bom dia. Amigos estou com dúvida em um projeto quando tento mockar o Repositório de Autenticação.

/// 5º passo - verificar a chamada do método verify(mockAuthRepository.loginUsuario(email: email, senha: senha)).called(1);

Nesse 5º passo parece que o método loginUsuario() não é chamado

@GenerateMocks([AuthRepository])
main() {
  testWidgets('Deve realizar o login', (tester) async {
    final mockAuthRepository = MockAuthRepository();

    final email = 'teste@teste.com';
    final senha = 'senha123';

    Get.create<AuthRepository>(
      () => MockAuthRepository(),
    );

    await tester.pumpWidget(
      GetMaterialApp(
        title: "Application",
        initialRoute: AppPages.INITIAL,
        getPages: AppPages.routes,
      ),
    );

    /// Acha a instância do LoginController
    bool test = Get.isRegistered<LoginController>();
    expect(test, true);
    LoginController controller = Get.find();

    /// 1º passo - apresentar o LoginView
    final loginView = find.byType(LoginView);
    expect(loginView, findsOneWidget);

    /// 2º passo - digitar no campo o e-mail
    final emailTextFormField =
        find.byWidgetPredicate((widget) => keyMatcher(widget, 'inputEmail'));
    expect(emailTextFormField, findsOneWidget);
    await tester.enterText(emailTextFormField, email);

    /// 3º passo - digitar no campo o e-mail
    final senhaTextFormField =
        find.byWidgetPredicate((widget) => keyMatcher(widget, 'inputEmail'));
    expect(senhaTextFormField, findsOneWidget);
    await tester.enterText(senhaTextFormField, senha);

    /// 4º passo - Clicar no button Entrar
    final button =
        find.byWidgetPredicate((widget) => keyMatcher(widget, 'submitButton'));

    expect(button, findsOneWidget);

    final user = await credenciais();

    when(mockAuthRepository.loginUsuario(email: email, senha: senha))
        .thenAnswer((_) async => Future.value(user));

    await tester.tap(button);

    await tester.pumpAndSettle();

    /// 5º passo - verificar a chamada do método
    verify(mockAuthRepository.loginUsuario(email: email, senha: senha)).called(1);
  });
}

/// Cria um UserCrendential fake
Future<UserCredential?> credenciais() async {
  try {
    final googleSignIn = MockGoogleSignIn();
    final signinAccount = await googleSignIn.signIn();
    final googleAuth = await signinAccount!.authentication;
    final AuthCredential credential = GoogleAuthProvider.credential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    // Sign in.
    final user = MockUser(
      isAnonymous: false,
      uid: 'testeId',
      email: 'teste@teste.com',
      displayName: 'Teste',
    );
    final auth = MockFirebaseAuth(mockUser: user);
    final userCredential = await auth.signInWithCredential(credential);
    return userCredential;
  } catch (e) {
    print('Erro ao criar uma credencial Fake: $e');
  }
}

/// Verifica a igualdade da Key de um Widget
bool keyMatcher(Widget widget, key) {
  return widget.key == Key(key) ? true : false;
}

══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════ The following TestFailure object was thrown running a test: No matching calls (actually, no calls at all). (If you called verify(...).called(0);, please instead use verifyNever(...);.)

1 resposta
solução!

Oi Rodrigo, tudo bem?

Pelo que entendi, você está com dificuldades em mockar o Repositório de Autenticação em um projeto, correto? No seu código, você está tentando verificar a chamada do método loginUsuario() no 5º passo, mas parece que o método não está sendo chamado.

Pelo erro que você postou, o problema parece estar na falta de chamadas do método. Verifique se você está chamando corretamente o método loginUsuario() e se ele está sendo chamado no momento certo.

Caso ainda tenha dúvidas, sugiro que você revise o seu código e verifique se não há nenhum erro de digitação ou de lógica.

Um abraço e bons estudos.