【问题标题】:Flutter FirebaseAuth unit testingFlutter FirebaseAuth 单元测试
【发布时间】:2023-01-30 09:20:00
【问题描述】:

我正在尝试测试使用 FirebaseAuth 登录的整个 AuthManager 类。这是我的文件:

    class AuthManager extends ChangeNotifier {
      final FirebaseAuth auth;
    
      Stream<User?> get user => auth.authStateChanges();
    
      static Future<FirebaseApp> initializeFirebase({
        required BuildContext context,
      }) async {
        FirebaseApp firebaseApp = await Firebase.initializeApp();
    
        return firebaseApp;
      }
    
      AuthManager({required this.auth});
    
      Future<String> signup(String email, String password) async {
        try {
          final credential = await auth.createUserWithEmailAndPassword(
            email: email,
            password: password,
          );
          return "Success";
        } on FirebaseAuthException catch (e) {
          rethrow;
        }
      }
    
      Future<String> signInWithEmailAndPassword(
          String email, String password) async {
        try {
          final userCredential = await auth.signInWithEmailAndPassword(
              email: email, password: password);
          return "Success";
        } on FirebaseAuthException catch (e) {
          return "Failed";
        } catch (e) {
          rethrow;
        }
      }
    
      static Future<String> signOut() async {
        try {
          await FirebaseAuth.instance.signOut();
          return "Success";
        } catch (e) {
          rethrow;
        }
      }
    }

我曾经返回 usercredential 但想尝试测试一个简单的字符串返回测试,遵循本教程:https://www.youtube.com/watch?v=4d6hEaUVvuU,这是我的测试文件

import 'package:firebase_auth/firebase_auth.dart';
import 'package:notes_firebase_app/data/models/auth_manager.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';

class MockFirebaseAuth extends Mock implements FirebaseAuth {
  @override
  Stream<User> authStateChanges() {
    return Stream.fromIterable([
      _mockUser,
    ]);
  }
}

class MockUser extends Mock implements User {}

final MockUser _mockUser = MockUser();

class MockUserCredential extends Mock implements Future<UserCredential> {}

void main() {
  final MockFirebaseAuth mockFirebaseAuth = MockFirebaseAuth();
  final AuthManager authManager = AuthManager(auth: mockFirebaseAuth);
  final MockUserCredential mockUserCredential = MockUserCredential();
  setUp(() {});
  test("emit occurs", () async {
    expectLater(authManager.user, emitsInOrder([_mockUser]));
  });

  test("create account", () async {
    when(mockFirebaseAuth.createUserWithEmailAndPassword(
            email: "tadas@gmail.com", password: "123456"))
        .thenAnswer((realInvocation) => null);

    expect(
        await authManager.signInWithEmailAndPassword(
            "tadas@gmail.com", "123456"),
        "Success");
  });
}

我在这里面临两个问题,不能传递 null 因为我们现在需要处理它或者抛出这个错误

The return type 'Null' isn't a 'Future<UserCredential>', as required by the closure's context

然后我试着像这样模拟 UserCredential。

  final MockUserCredential mockUserCredential = MockUserCredential();

    when(mockFirebaseAuth.createUserWithEmailAndPassword(
            email: "tadas@gmail.com", password: "123456"))
        .thenAnswer((realInvocation) => mockUserCredential);

但我收到此错误:

type 'Null' is not a subtype of type 'Future<UserCredential>'

我究竟做错了什么 ?帮助将不胜感激。

【问题讨论】:

  • 你好,你解决了吗?
  • 用最新的包试试这个answer

标签: flutter unit-testing firebase-authentication mockito


【解决方案1】:

我不太确定,但 mockito 包可能需要一个生成器。尝试 mocktail 包并使用 when(()=&gt; mockFirebaseAuth.createUserWithEmailAndPassword( email: "tadas@gmail.com", password: "123456")).thenAnswer((realInvocation) =&gt; null); 在 when() 中使用回调函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 2022-11-04
    • 2020-01-18
    • 2019-04-13
    • 2022-10-18
    • 2022-08-04
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多