firebase_database_mocks 0.3.1 firebase_database_mocks: ^0.3.1 copied to clipboard
Fakes to write unit tests for FirebaseDatabase (real-time database).
firebase_database_mocks #
A Library that make it easy to write unit tests for FirebaseDatabase (real-time database).
Usage #
Get an Instance of MockFirebaseDatabase
like this : MockFirebaseDatabase.instance
, then use it in your tests as if it was the reel
FirebaseDatabase.instance
.
By default the library keeps the data in memory as long as the tests are running, but you can disable the data persistance as follow:
MockFirebaseDatabase.setDataPersistanceEnabled(ennabled: false);
.
If the data persistance is disabled, each time you create an instance of MockDatabaseReference
either by using the constructor: MockDatabaseReference()
, or by geting the root reference on MockFirebaseDatabase
instance : MockFirebaseDatabase.instance.reference()
a new data store is created instead of using the cached one.
Note: The
MockFirebaseDatabase.setDataPersistanceEnabled()
function is currently experimental, so you might face some issues when you disable the data persitance.
Code Sample #
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',
}),
);
});
}
As you can see you don't need to initialize firabase core for testing or call
TestWidgetsFlutterBinding.ensureInitialized()
before using MockFirebaseDatabase
but in bonus if you use another firebase service that needs it, you can simply call
the setupFirebaseMocks()
top level function which performs all required operations
for testing a firebase service that isn't fully mocked.
A few resources to get you started if this is your first Flutter project:
For help getting started with Flutter, view our online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.