【问题标题】:Flutter Unit Test for a Firebase FunctionFirebase 函数的 Flutter 单元测试
【发布时间】:2022-08-04 17:31:26
【问题描述】:

我是 Flutter 的新手,我想尝试为我创建的一个函数进行单元测试。该功能只是测试用户提供的用于登录的电子邮件和密码是否正确。因此,该函数提供与数据库的连接并验证电子邮件和密码是否有效。

我尝试使用 mockito 进行单元测试以模拟 Firebase,但效果不佳。我的函数返回一个 \"UserCredential\" 类型,我不知道如何用 Mocks 验证它。我试图为这种类型创建一个 Mock,但它说 \"type \'Null\' 不是类型 \'Future\'\" 的子类型...

任何人都可以做出明确的解释吗? :)

要测试的 Firebase 功能

import \'package:firebase_auth/firebase_auth.dart\';
import \'package:flexmes/data/models/user_model.dart\';

class UserAPI{
  final CustomUser _customUser = CustomUser();
  final FirebaseAuth auth;
  UserAPI({required this.auth});

  Future<UserCredential?> signInWithEmailAndPassword(String email, String password) async {
    try{
      UserCredential result =  await auth.signInWithEmailAndPassword(email: email, password: password);
      print (result);
      return result;
    } catch (error){
      print (error);
      return null;
    }
  }
}

signInWithEmailAndPassword 函数的单元测试

import \'package:firebase_auth/firebase_auth.dart\';
import \'package:flexmes/data/data_providers/user_provider.dart\';
import \'package:flutter_test/flutter_test.dart\';
import \'package:mockito/annotations.dart\';
import \'package:mockito/mockito.dart\';

class MockFirebaseAuth extends Mock implements FirebaseAuth{}
class MockUserCredential extends Mock implements UserCredential{}

void main(){
  final MockFirebaseAuth mockAuth = MockFirebaseAuth();
  final MockUserCredential userCredential = MockUserCredential();
  group(\'description\', () {
    late UserAPI userAPI;
    
    setUp(() {
      userAPI = UserAPI(auth: mockAuth);
    });

    tearDown(() {
    });

    test(\'Sign in with Email & Password\', () async {
      when(mockAuth.signInWithEmailAndPassword(email: \"admin@admin.com\", password: \"password\")).
      thenAnswer((_) => Future<MockUserCredential>.value(userCredential));
      expect(await userAPI.signInWithEmailAndPassword(\"admin@admin.com\", \"password\"), userCredential);
    });
  });

}
  • 你好,你解决了吗。我也面临同样的问题:(
  • 找到解决方案了吗?

标签: flutter unit-testing mocking mockito


【解决方案1】:

有可用的模拟身份验证包firebase_auth_mocksgoogle_sign_in_mocks

您可以像这样替换您的代码

const _email = 'ilyas@yopmail.com';
const _uid = 'sampleUid';
const _displayName = 'ilyas';
const _password = 'Test@123';
     final _mockUser = MockUser(
      uid: _uid,
      email: _email,
      displayName: _displayName,
    );
        final auth = MockFirebaseAuth(mockUser: _mockUser);
    
    test('signIn function test', () async {
          final user = await userAPI. signInWithEmailAndPassword(_email,_password);
          expect(user?.uid, _mockUser.uid);
        });

google_sign_in_mocks这可以用于 GoogleSignIn 测试

【讨论】:

    猜你喜欢
    • 2019-04-13
    • 2018-11-13
    • 1970-01-01
    • 2022-11-04
    • 2023-01-30
    • 2019-04-29
    • 1970-01-01
    • 2021-10-06
    • 2020-01-18
    相关资源
    最近更新 更多