firebase - 如何在 Flutter 中模拟 Firebase 实时数据库?
问题描述
在其他任何事情之前,我想澄清一下我问的是Firebase Realtime Database
不是Firestore
.
背景:
我有一个同时使用 Firestore 和 Firebase 实时数据库的应用程序。我找到了一种对 Firestore 进行单元测试的方法,方法是使用dart pub的cloud firestore mocks 包对其进行模拟。到目前为止,我一直在尝试搜索 Firebase 实时数据库是否有任何等价物,但我还没有看到。这里和谷歌..
所以我的问题是,如何创建一个需要模拟 FirebaseDatabase 实例的单元测试?类似于您在模拟 firestore 包中的操作方式,以便我可以执行以下操作:
MockDbInstance mockFirebaseDatabaseInstance = MockFirebaseDatabaseInstance();
await mockFirebaseDatabaseInstance.reference().child("this_node").setValue(myObject);
更新:
我们找不到轻松测试 RTDB 的方法,因此我们决定将所有数据移至 FireStore。
解决方案
我写了一个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',
}),
);
});
}
推荐阅读
- asp.net - 如何以角度发送外键ID和表单数据?
- robot - 如何通过在 webbots 中共享一个机械手来连接两个机械臂
- java - RadioGroup ,再次单击相同的元素不起作用
- swift - 带有 RxSwift 的搜索栏取消按钮
- python - 如何使用 pandas groupby() 显示每列 2 个事物的值?
- c++14 - 尽管在 onlinegdb 中运行,但代码未在 Hackerrank 中运行
- mysql - 从 mongodb atlas 复制到本地?
- c# - 无法加载文件或程序集“MFCM140”或其依赖项之一
- java - 为什么我的 FireBase ValueEventListener 在执行 onDataChange() 处理程序时会抛出 NullPointerException?
- java - Firebase 未向实时数据库添加类