【问题标题】:How to mock Firebase Realtime Database in Flutter?如何在 Flutter 中模拟 Firebase 实时数据库?
【发布时间】:2021-01-24 06:41:13
【问题描述】:

首先我想澄清一下,我问的是Firebase Realtime Database,而不是Firestore

背景:

我有一个同时使用 Firestore 和 Firebase 实时数据库的应用。我找到了一种通过在 dart pub 使用 cloud firestore mocks package 模拟 Firestore 来对 Firestore 进行单元测试的方法。到目前为止,我一直在尝试搜索 Firebase 实时数据库是否有任何等价物,但我还没有看到。这里和谷歌..

所以我的问题是,如何创建需要模拟 FirebaseDatabase 实例的单元测试?类似于您在模拟 firestore 包中的操作方式,以便我可以执行以下操作:

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

更新:

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

【问题讨论】:

  • 如果有人正在寻找解决方案,我们最终会一直使用 Firestore。

标签: firebase flutter firebase-realtime-database


【解决方案1】:

我写了一个fireabase_database_mocks 模拟firebase 实时数据库的包,但它不完整它不支持模拟事件 就像现在的 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',
      }),
    );
  });
}

【讨论】:

  • 这很棒。感谢分享。
猜你喜欢
  • 2021-10-22
  • 2022-08-05
  • 2021-04-08
  • 1970-01-01
  • 2021-04-22
  • 2020-09-13
  • 2021-07-01
  • 2021-04-09
  • 2020-01-04
相关资源
最近更新 更多