android - Flutter UnitTest:同一类的两个不同的模拟

标签 android unit-testing testing flutter dart

目前,我正在为我的移动网络应用程序(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;
    }
  }

因此,正如您所看到的,我仅检查用户数据是否正确-我将返回一个 bool(boolean) 值以在另一个文件中对此进行检查(如果返回true,则Navigator路由到另一个站点,如果返回错误,则返回错误消息弹出)。

我的单元测试例如检查以下几种情况:
  • 正确的数据
  • 数据不正确(userData不为空或null)
  • 空数据

  • 测试的示例代码:
    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。我该如何更改? :) Bt.w我正在使用Mockito。

    我的想法是:
  • 要获取正确的数据,请返回包含用户的模拟。
  • 对于无效数据,返回用户为null的模拟。

  • 非常感谢。 :)

    最佳答案

    我是最近在寻找答案,却偶然发现了您的问题。但与此同时,我找到了解决方案。希望这对您有用。
    我发现有一堆用于模拟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';
    }
    

    关于android - Flutter UnitTest:同一类的两个不同的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59555349/

    相关文章:

    android - 客户端上的 Bcrypt 哈希密码与服务器密码不匹配

    android - 无法将数据推送到 android wear(模拟器)

    java - junit:使用mockmvc测试 Controller 时注入(inject)bean上的NullPointer

    java - @PrepareForTest、@RunWith 和 lambda 表达式

    android - 如何在 Android 上测试库?

    testing - 我怎样才能得到旧的浏览器?(用于测试)

    Android UI 滞后于设置图像

    android - 为什么 OpenGL 纹理在 Eclipse 中使用调试器运行时呈现良好,但在单独运行应用程序时呈现白色?

    c# - 在 TFS 构建服务器上运行单元测试 Fakes Framework |错误

    performance - Scalatest 需要 30 秒才能开始测试