firebase_database_mocks 0.3.0 copy "firebase_database_mocks: ^0.3.0" to clipboard
firebase_database_mocks: ^0.3.0 copied to clipboard

outdated

Fakes to write unit tests for FirebaseDatabase (real-time database).

firebase_database_mocks #

Pub Version test: passing codecov style: effective dart

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.