Flutter模拟Google登录插件google_sign_in_mocks的使用

Flutter模拟Google登录插件google_sign_in_mocks的使用

简介

google_sign_in_mocks 是一个用于模拟 google_sign_in 插件行为的库,主要用于单元测试中。结合 firebase_auth_mocks,可以方便地编写涉及 Firebase 认证的单元测试。

pub package unit-tests

使用方法

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  google_sign_in_mocks: ^0.1.0 # 请根据实际情况选择最新版本

示例代码

下面是一个完整的示例demo,展示了如何使用 google_sign_in_mocks 进行单元测试:

测试文件:test/google_sign_in_test.dart

import 'package:google_sign_in_mocks/google_sign_in_mocks.dart';
import 'package:test/test.dart';

void main() {
  late MockGoogleSignIn googleSignIn;

  setUp(() {
    // 初始化MockGoogleSignIn实例
    googleSignIn = MockGoogleSignIn();
  });

  test('should return idToken and accessToken when authenticating', () async {
    // 模拟用户登录
    final signInAccount = await googleSignIn.signIn();
    final signInAuthentication = await signInAccount!.authentication;

    // 验证返回的认证信息是否正确
    expect(signInAuthentication, isNotNull);
    expect(googleSignIn.currentUser, isNotNull);
    expect(signInAuthentication.accessToken, isNotNull);
    expect(signInAuthentication.idToken, isNotNull);
  });

  test('should return null when google login is cancelled by the user', () async {
    // 设置模拟取消登录
    googleSignIn.setIsCancelled(true);

    // 模拟用户取消登录
    final signInAccount = await googleSignIn.signIn();

    // 验证返回结果为null
    expect(signInAccount, isNull);
  });

  test('testing google login twice, once cancelled, once not cancelled at the same test.', () async {
    // 第一次尝试:模拟取消登录
    googleSignIn.setIsCancelled(true);
    final signInAccount = await googleSignIn.signIn();
    expect(signInAccount, isNull);

    // 第二次尝试:正常登录
    googleSignIn.setIsCancelled(false);
    final signInAccountSecondAttempt = await googleSignIn.signIn();
    expect(signInAccountSecondAttempt, isNotNull);
  });
}

关键点解释

  • MockGoogleSignIn:这是 google_sign_in_mocks 提供的主要类,用于模拟 GoogleSignIn 的行为。
  • setIsCancelled:通过调用 setIsCancelled(bool) 方法可以模拟用户是否取消了登录操作。
  • signInauthentication:这两个方法分别模拟了用户的登录过程和获取认证信息的过程。

功能与Bug

如果您发现任何问题或有功能需求,请在 issue tracker 中提交反馈。


希望这个详细的示例能帮助您更好地理解和使用 google_sign_in_mocks。如果有任何疑问,欢迎继续讨论!


更多关于Flutter模拟Google登录插件google_sign_in_mocks的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模拟Google登录插件google_sign_in_mocks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,模拟Google登录功能通常用于测试目的,以确保应用程序在没有实际Google账户的情况下仍能正确运行。google_sign_in_mocks插件可以帮助我们在测试环境中模拟Google登录流程。下面是一个关于如何使用google_sign_in_mocks的示例代码案例。

首先,确保你已经在pubspec.yaml文件中添加了必要的依赖项:

dependencies:
  flutter:
    sdk: flutter
  google_sign_in: ^5.0.0  # 请检查最新版本号

dev_dependencies:
  flutter_test:
    sdk: flutter
  google_sign_in_mocks: ^0.0.1  # 请检查最新版本号,注意这是一个模拟库,实际版本号可能不同

然后,运行flutter pub get来获取这些依赖项。

接下来,在你的测试文件中使用google_sign_in_mocks。假设我们有一个google_sign_in_service.dart文件,它封装了Google登录逻辑,我们将为这个文件编写测试。

google_sign_in_service.dart

import 'package:google_sign_in/google_sign_in.dart';
import 'package:flutter/foundation.dart';

class GoogleSignInService {
  final GoogleSignIn _googleSignIn = GoogleSignIn(
    scopes: <String>[
      'email',
      'https://www.googleapis.com/auth/userinfo.profile',
    ],
  );

  Future<GoogleSignInAccount?> signIn() async {
    try {
      final GoogleSignInAccount? account = await _googleSignIn.signIn();
      if (account != null) {
        // 获取用户信息等操作
        return account;
      }
    } catch (e) {
      print('Google Sign In failed: $e');
    }
    return null;
  }

  Future<void> signOut() async {
    await _googleSignIn.signOut();
  }
}

google_sign_in_service_test.dart

import 'package:flutter_test/flutter_test.dart';
import 'package:google_sign_in_mocks/google_sign_in_mocks.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'google_sign_in_service.dart';

void main() {
  late MockGoogleSignIn mockGoogleSignIn;
  late GoogleSignInService googleSignInService;

  setUp(() {
    mockGoogleSignIn = MockGoogleSignIn();
    googleSignInService = GoogleSignInService().._googleSignIn = mockGoogleSignIn;
  });

  test('signs in user', () async {
    final GoogleSignInAccount mockAccount = GoogleSignInAccount(
      id: 'test-user-id',
      displayName: 'Test User',
      email: 'testuser@example.com',
      photoUrl: Uri.parse('https://example.com/photo.jpg'),
    );

    when(mockGoogleSignIn.signIn()).thenAnswer((_) async => mockAccount);

    final GoogleSignInAccount? result = await googleSignInService.signIn();

    expect(result, isNotNull);
    expect(result?.id, 'test-user-id');
    expect(result?.email, 'testuser@example.com');

    verify(mockGoogleSignIn.signIn()).called(1);
  });

  test('fails to sign in user', () async {
    when(mockGoogleSignIn.signIn()).thenThrow(Exception('Sign in failed'));

    final GoogleSignInAccount? result = await googleSignInService.signIn();

    expect(result, isNull);

    verify(mockGoogleSignIn.signIn()).called(1);
  });

  test('signs out user', () async {
    await googleSignInService.signOut();

    verify(mockGoogleSignIn.signOut()).called(1);
  });
}

解释

  1. 依赖项:在pubspec.yaml中添加google_sign_ingoogle_sign_in_mocks依赖项。
  2. 服务类:在google_sign_in_service.dart中创建一个封装Google登录逻辑的服务类。
  3. 测试类:在google_sign_in_service_test.dart中使用MockGoogleSignIn来模拟Google登录,并编写测试用例来验证登录、登录失败和登出功能。

通过这些步骤,你可以使用google_sign_in_mocks来模拟Google登录,从而在不依赖实际Google账户的情况下测试你的Flutter应用程序。

回到顶部