【问题标题】:Flutter UnitTest: Two different mocks for the same classFlutter UnitTest:同一类的两个不同模拟
【发布时间】:2020-01-01 19:09:31
【问题描述】:

目前我正在为我的移动 Web 应用程序(Android 应用程序)编写单元测试。单元测试是指我基于 Google Firebase Auth 构建的登录系统。

随着firebase authentication 插件的最新版本之一,某些函数的返回类型已更改。例如,方法firebaseAuth.signInWithEmailAndPassword已从FirebaseUser更改为AuthResult

我在AuthService.dart 中有一个登录 功能,内容如下:

Future<bool> login(LoginUserData userData) async {
    try {
      _checkUserDataValidity(userData);
      final AuthResult authResult= await firebaseAuth.signInWithEmailAndPassword(email: userData.email, password: userData.password);
      return authResult.user != null;
    } catch (exception) {
      return false;
    }
  }

所以,如您所见,我只是在检查用户的数据是否正确 - 我返回一个布尔值以在另一个文件中检查这一点(如果返回 true,Navigator 将路由到另一个站点,如果返回错误,则会弹出错误消息)。

我的单元测试例如检查几个案例:

  1. 正确的数据
  2. 数据不正确(userData 不为空或 null)
  3. 空数据

测试示例代码:

test('Login should work with valid user data', () async {
      when(
        firebaseAuthMock.signInWithEmailAndPassword(
          email: testValidUserData.email,
          password: testValidUserData.password,
        )
      ).thenAnswer(
        (_) => Future<AuthResultMock>.value(firebaseAuthResultMock)
      );

      final bool actionSuccess = await authService.login(testValidUserData);

      verify(
        firebaseAuthMock.signInWithEmailAndPassword(
          email: testValidUserData.email,
          password: testValidUserData.password,
        )
      ).called(1);

      expect(actionSuccess, true);
    });

为了涵盖我上面列表的第一种和第二种情况,我想使用两种不同的 Mocks。一个 Mock 包含一个用户,另一个 Mock 中没有用户。

当前问题:

(_) => Future<AuthResultMock>.value(firebaseAuthResultMock)

在我的测试中与AuthServie.dart中的这段代码冲突

return authResult.user != null;

模拟的用户为 null。我怎样才能改变这个? :) 顺便说一句,我正在使用 Mockito。

我的想法是:

  1. 对于正确的数据,返回一个包含用户的模拟。
  2. 对于无效数据,返回一个以 null 为用户的 mock。

非常感谢。 :)

【问题讨论】:

    标签: android unit-testing testing flutter dart


    【解决方案1】:

    我最近刚刚在寻找答案,偶然发现了您的问题。但与此同时,我找到了解决方案。我希望这对你有用。

    我发现有一堆用于模拟firebase的flutter包,用于Firebase Auth的一个是这个:https://pub.dev/packages/firebase_auth_mocks

    此外,如果您不想在代码中导入更多包,您可以创建一个更简单的版本。像这样:

    class MockFirebaseAuth extends Mock implements FirebaseAuth {}
    
    class MockAuthResult extends Mock implements AuthResult {
      FirebaseUser user = MockFirebaseUser();
    }
    
    class MockFirebaseUser extends Mock implements FirebaseUser {
      @override
      String get displayName => 'Test Name';
    
      @override
      String get uid => 'abc1234';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 2014-04-21
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多