gpt4 book ai didi

firebase - 如何从 Dart VM/Dart 集成测试访问 Firebase Firestore?

转载 作者:行者123 更新时间:2023-12-03 02:55:11 25 4
gpt4 key购买 nike

我正在编写一个 Flutter 应用程序,它在 Firebase Firestore 文档上具有相当复杂的逻辑。
我正在尝试使用 flutter_test 编写单元测试实际上对数据库执行此逻辑(我知道这在技术上是一个集成测试)。这是因为这个逻辑有很多边缘情况,如果针对真实数据库进行测试,我只能确定它是有效的。

这似乎是一项不可能完成的任务。

  • cloud_firestore由于身份验证的实现方式,包只能在手机内部运行。
  • firebase包有 2 个“实现”。一种只能在浏览器上运行,另一种是 Dart VM,它是 REST API 的低级包装器,几乎完全没有文档记录。

  • 2. firebase Dart VM 的包有这个例子:
    import 'package:firebase/firebase_io.dart';

    void main() {
    var credential = ... // Retrieve auth credential
    var fbClient = new FirebaseClient(credential); // FirebaseClient.anonymous() is also available

    var path = ... // Full path to your database location with .json appended

    // GET
    var response = await fbClient.get(path);

    // DELETE
    await fbClient.delete(path);

    ...
    }

    ...但是它没有显示如何获得 credential . googleapis包显示了如何获取 credentials :
    final _credentials = new ServiceAccountCredentials.fromJson(r'''
    {
    "private_key_id": ...,
    "private_key": ...,
    "client_email": ...,
    "client_id": ...,
    "type": "service_account"
    }
    ''');

    ...然而这个对象不是一个字符串,它没有写在任何地方如何将它转换为 FirebaseClient类期望( toString() 不起作用)。有一个 Github issue关于如何获取此凭据的 firebase 软件包,但仍未得到答复。

    我发现很难相信网上没有可用的信息,我可以找到,关于如何为 Firebase Firestore 编写适当的集成测试。

    注意事项:
  • 我对 mock Firestore 没有兴趣,因为我的逻辑很复杂,而且我想针对真实数据库测试每个边缘情况。
  • 我没有兴趣使用 Flutter Driver因为测试是像手机中的普通应用程序一样安装的,这在开发过程中需要时间,而且调试不像常规单元测试那样直接。 Android Studio 有非常好的测试调试工具。

  • 我应该如何编写访问 Firebase Firestore 的集成测试?

    最佳答案

    对于其他被带到这里的人,就像我几个小时前一样,通过寻找创造神秘的方法credential对象在使用带有 Firebase 的 dart VM 时,以下是我的解决方案,它至少适用于访问 Firestore。
    工作由 Credentials 类完成:(在下面实现)

    import 'package:firebase/firebase_io.dart';

    String credential = await Credentials.fetch();
    FirebaseClient fbClient = new FirebaseClient(credential);
    Credentials 类使用 Firebase 服务帐户私钥中的数据创建凭据(Firebase 控制台 > [项目] > 设置 > 项目设置 > 服务帐户,然后下载私钥)。
    import 'dart:io';
    import 'dart:convert';
    import "package:googleapis_auth/auth_io.dart";
    import 'package:http/http.dart' as http;

    class Credentials {

    /// Returns a credential string to be used in the constructor
    /// of [FirebaseClient].
    static Future<String> fetch() async {
    Map<String, dynamic> pk = await getPrivateKey();
    // Fields from Firebase private key
    var accountCredentials = ServiceAccountCredentials.fromJson({
    "private_key_id": pk['private_key_id'],
    "private_key": pk['private_key'],
    "client_email": pk['client_email'],
    "client_id": pk['client_id'],
    "type": "service_account",
    });

    // Define the required scopes.
    // see https://firebase.google.com/docs/firestore/use-rest-api#working_with_google_identity_oauth_20_tokens
    var scopes = [
    "https://www.googleapis.com/auth/datastore",
    ];

    var client = new http.Client();
    AccessCredentials credentials =
    await obtainAccessCredentialsViaServiceAccount(
    accountCredentials, scopes, client);
    client.close();
    return credentials.accessToken.data;
    }

    static Future<Map<String, dynamic>> getPrivateKey() async {
    String jsonString =
    await File('/Path/to/firebase_private_key/keyfile.json')
    .readAsString();
    return json.decode(jsonString);
    }
    }

    关于firebase - 如何从 Dart VM/Dart 集成测试访问 Firebase Firestore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61835023/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com