当前位置: 首页 > 知识库问答 >
问题:

如何在Flutter中模拟Firebase实时数据库?

苏健柏
2023-03-14

在做任何其他事情之前,我想澄清,我问的是Firebase实时数据而不是Firestore

背景:

我有一个应用程序,同时使用Firestore和Firebase实时数据库。我发现了一种单元测试Firestore的方法,通过在dart pub使用cloud firestore模拟包来模拟它。到目前为止,我一直在试图搜索是否有任何Firebase实时数据库的等价物,我没有看到任何。这里和谷歌都有..

所以我的问题是,如何创建一个需要模拟FirebaseDatabase实例的单元测试?类似于您可以在模拟firestore包中这样做,这样我可以做类似的事情:

MockDbInstance mockFirebaseDatabaseInstance = MockFirebaseDatabaseInstance();
await mockFirebaseDatabaseInstance.reference().child("this_node").setValue(myObject);

更新:

我们找不到一种轻松测试RTDB的方法,因此我们决定将所有数据移动到FireStore。

共有1个答案

姚钊
2023-03-14

我写了一个模拟Firebase实时数据库的fireabase_database_mocks包,但它是不完整的,它目前不支持模拟类似onChildAdded的事件,但它是可行的。这是一个使用fireabase_database_mocks的示例

import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_database_mocks/firebase_database_mocks.dart';
import 'package:flutter_test/flutter_test.dart';

class UserRepository {
  UserRepository(this.firebaseDatabase);
  FirebaseDatabase firebaseDatabase;

  Future<String> getUserName(String userId) async {
    final userNameReference =
        firebaseDatabase.reference().child('users').child(userId).child('name');
    final dataSnapshot = await userNameReference.once();
    return dataSnapshot.value;
  }

  Future<Map<String, dynamic>> getUser(String userId) async {
    final userNode = firebaseDatabase.reference().child('users/$userId');
    final dataSnapshot = await userNode.once();
    return dataSnapshot.value;
  }
}

void main() {
  FirebaseDatabase firebaseDatabase;
  UserRepository userRepository;
  // Put fake data
  const userId = 'userId';
  const userName = 'Elon musk';
  const fakeData = {
    'users': {
      userId: {
        'name': userName,
        'email': 'musk.email@tesla.com',
        'photoUrl': 'url-to-photo.jpg',
      },
      'otherUserId': {
        'name': 'userName',
        'email': 'othermusk.email@tesla.com',
        'photoUrl': 'other_url-to-photo.jpg',
      }
    }
  };
  MockFirebaseDatabase.instance.reference().set(fakeData);
  setUp(() {
    firebaseDatabase = MockFirebaseDatabase.instance;
    userRepository = UserRepository(firebaseDatabase);
  });
  test('Should get userName ...', () async {
    final userNameFromFakeDatabase = await userRepository.getUserName(userId);
    expect(userNameFromFakeDatabase, equals(userName));
  });

  test('Should get user ...', () async {
    final userNameFromFakeDatabase = await userRepository.getUser(userId);
    expect(
      userNameFromFakeDatabase,
      equals({
        'name': userName,
        'email': 'musk.email@tesla.com',
        'photoUrl': 'url-to-photo.jpg',
      }),
    );
  });
}
 类似资料:
  • 我正在使用Flutter,我想从我的实时数据库Firebase中检索一些数据。我的实时数据库Firebase中存储了以下数据: 如何从中获取每一条信息?例如,我只想得到“Tom”这个名字?

  • 我试图让我的flutter应用程序在浏览器中工作,它依赖于Firebase_database。没有关于如何做到这一点的文档,但我根据firebase_core和firebase_auth文档做了一些假设: > https://github.com/firebaseextended/flutterfire/tree/master/packages/firebase_core/firebase_cor

  • 我想使用Flatter将数据从扫描仪打印到firebase实时数据库。我正在扫描条形码pdf417,并在列表视图中打印它,现在我想使用按钮将该数据存储到firebase实时数据库。 我正在使用颤振库https://pub.dev/packages/barcode_scanner作为参考。 请允许我帮忙,我会把我的代码贴在下面。提前感谢您的帮助。

  • 我正在尝试读取我的Flutter应用程序中的firebase实时数据库中的数据,并将其分配给模型类,但是,我在控制台中得到了以下错误。 下面是我到目前为止所做的代码 员工类别 我不知道我做错了什么,请帮我解决这个问题

  • 目前,我用flutter构建了一个板球拍卖类应用程序,在每个出价中,它都将在聊天屏幕上显示为聊天,我用Cloud Firestore用streams做了这件事,事情是在一个点之后,云Firestore的阅读量飙升。然后我意识到我只是更新了当前球员的金额(他的出价)。他的出价和出价的球队是唯一不断变化的东西。有了firestore,我可以用流获取所有这些数据,并轻松地将其显示在聊天屏幕上。现在我想改

  • 我正在一个聊天应用程序,其中消息存储在firebase实时数据库。现在,如果我创建一个如下所示的节点(Chats-Better-A-ID和-B-ID是自动生成的聊天室密钥),那么我想知道当用户S在聊天应用程序中打开与用户T聊天时,so数据库将只读取存储在Chats-Better-S-T-ID中的消息,而不会读取其他聊天室消息!?我说的对吗?如果是,那么它会降低定价吗? 或 如果我存储如下所示的数据