firebase - Flutter - Mockito Firestore...get() - 在 null 上调用方法 'document'

标签 firebase flutter dart google-cloud-firestore mockito

出于学习目的,我尝试使用 Mockito 模拟 Firestore Controller 类。

firestore_controller.dart

import 'package:cloud_firestore/cloud_firestore.dart';


class FirestoreController implements FirestoreControllerInterface {

  final Firestore firestoreApi;
  FirestoreController({this.firestoreApi});

  @override
  Future<DocumentSnapshot> read() async {
    final DocumentSnapshot document = await this.firestoreApi.collection('user').document('user_fooBar').get();
    return document;
  }
}

firestore_controller_test.dart

import 'package:flutter_test/flutter_test.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:mockito/mockito.dart';
import 'package:fooApp/Core/repositories/firebase/firestore_controller.dart';

class MockFirestoreBackend extends Mock implements Firestore {}
class MockDocumentSnapshot extends Mock implements DocumentSnapshot {}

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  group("Firebase Controller", () {

    final Firestore firestoreMock = MockFirestoreBackend();
    final MockDocumentSnapshot mockDocumentSnapshot = MockDocumentSnapshot();
    FirestoreController sut;

    test("try to read a document", () async {

      // Arrange
      final Map<String, dynamic> _fakeResponse = {
        'foo': 123,
        'bar': 'foobar was here',
      };

      sut = FirestoreController(firestoreApi: firestoreMock); // INJECT MOCK

      // Arrange: Mock
      when(firestoreMock.collection('user').document('user_fooBar').get()).thenAnswer((_) => Future<MockDocumentSnapshot>.value(mockDocumentSnapshot));
      when(mockDocumentSnapshot.data).thenReturn(_fakeResponse);

      // Act
      final fakeDocument = await sut.read();

    });
  });
}

🚨 控制台输出 🚨

NoSuchMethodError: The method 'document' was called on null.
Receiver: null
Tried calling: document("user_fooBar")

抱歉,如果错误很明显,这是我第一次使用 Mockito 我的错误在哪里?我想念什么?非常感谢!

最佳答案

试试这个:

https://pub.dev/packages/cloud_firestore_mocks

我使用它完成的测试:

class MockFirestore extends Mock implements Firestore {}
class MockDocument extends Mock implements DocumentSnapshot {}

void main() {
  final _tAppointmentModel = AppointmentModel(
    appointmentID: kAppointmentID,
    date: DateTime.parse("2020-12-05 20:18:04Z"),
    description: "test description",
    doctorID: kDoctorID,
    hospitalID: kHospitalID,
    infantID: kInfantID,
  );

  group('AppointmentModel tests: ', () {
    final tAppointmentID = kAppointmentID;
    final tInfantID = kInfantID;
    final tDoctorID = kDoctorID;
    final tHospitalID = kHospitalID;

    test('should be a subclass of Appointment', () async {
      expect(_tAppointmentModel, isA<Appointment>());
    });

    test('store and retrieve document from Firestore', () async {
      final instance = MockFirestoreInstance();
      await instance.collection('appointments').add({
        'appointmentID': tAppointmentID,
        'date': DateTime.parse("2020-12-05 20:18:04Z"),
        'description': "test description",
        'doctorID': tDoctorID,
        'hospitalID': tHospitalID,
        'infantID': tInfantID,
      });

      final snapshot = await instance.collection('appointments').getDocuments();
      final String expected = _tAppointmentModel.props[0];
      final String result = snapshot.documents[0].data['appointmentID'];
      expect(expected, result);
    });
  });
}

关于firebase - Flutter - Mockito Firestore...get() - 在 null 上调用方法 'document',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60436266/

相关文章:

flutter - @protected 在 dart 中是什么意思

javascript - Firepad 获取并保存内容

ios - 如何在应用程序启动时阻止 Firebase 记录状态更新

flutter - 如何在像Facebook这样的 flutter 中显示时差

c# - 将 Flutter 前端与 Android 和 iOS 的 .NET Core 后端相结合

android - Flutter 应用程序在使用 flutter_driver 运行时无法加载 Json 文件

javascript - React Native Firebase DataSnapshot

firebase - .firebase/hosting 的目的是什么?字母缓存

flutter 缓存SVG图像

flutter - dart中字符串的数学表达式