搜尋套件、儲存庫與 APP 分類

套件詳情v4.5.0

fake_cloud_firestore

先前稱為 cloud_firestore_mocks。Cloud Firestore 的偽造實作。使用此套件來對使用 Cloud Firestore 的應用進行單元測試。

AndroidiOSWebmacOSWindows
近 30 天下載
30.7萬
喜歡數
147
Pub 分數
150

安裝套件

flutter pub add fake_cloud_firestore

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

一個用於單元測試 Flutter 應用程式的 Cloud Firestore 虛擬實作。它模擬真實 Cloud Firestore 服務的行為,讓開發者能在不需要實際 Firebase 後端的情況下測試應用程式資料邏輯。此套件非常適合隔離測試,並在開發過程中確保一致且可重複的結果。最初稱為 cloud_firestore_mocks,支援所有主要平台,包括 Android、iOS、Web、macOS 和 Windows。

適用情境

  • 單元測試依賴 Firestore 的邏輯
  • 在沒有即時 Firebase 連接的情況下測試應用狀態
  • 在整合測試期間隔離組件
  • 在測試中模擬不同的 Firestore 回應
  • 部署前驗證數據處理

主要特色

  • 與 Cloud Firestore API 完全相容
  • 支援所有主要的Flutter平台
  • 測試環境的簡易設定
  • 模擬的文件和集合操作
  • 不需要 Firebase 專案設定

適合對象

  • Flutter 開發人員撰寫單元測試
  • 優先考慮測試可靠性的團隊
  • 具有複雜 Firestore 互動的專案
  • 開發人員在測試中避免真實的 Firebase 成本
  • 需要確定性測試結果的應用程式

使用建議

  • 不適用於端對端測試
  • 不複製即時同步行為
  • 僅限測試客戶端邏輯
  • 需要手動設定初始資料
  • 可能無法反映真實 Firestore 的所有邊緣情況

原始 README

以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。

Fake Cloud Firestore

pub package Unit Tests Buy Me A Coffee

Fakes to write unit tests for Cloud Firestore. Instantiate a FakeFirebaseFirestore, then pass it around your project as if it were a FirebaseFirestore. This Fake acts like Firestore except that will only keep the data in memory. To help debug, you can use FakeFirebaseFirestore.dump() to see what's in the fake database. This is useful to set up the state of your database, then check that your UI behaves the way you expect.

This project works well with firebase_auth_mocks. If you use them together, you can even test your app with security rules. See below.

Usage

Simple example
import 'package:fake_cloud_firestore/fake_cloud_firestore.dart';

void main() {
  final instance = FakeFirebaseFirestore();
  await instance.collection('users').add({
    'username': 'Bob',
  });
  final snapshot = await instance.collection('users').get();
  print(snapshot.docs.length); // 1
  print(snapshot.docs.first.get('username')); // 'Bob'
  print(instance.dump());
}

// Prints out:
// {
//   "users": {
//     "z": {
//       "name": "Bob"
//     }
//   }
// }

See more examples at fake_cloud_firestore/test/fake_cloud_firestore_test.dart.

In a UI test
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:fake_cloud_firestore/fake_cloud_firestore.dart';
import 'package:firestore_example/main.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

const MessagesCollection = 'messages';

void main() {
  testWidgets('shows messages', (WidgetTester tester) async {
    // Populate the fake database.
    final firestore = FakeFirebaseFirestore();
    await firestore.collection(MessagesCollection).add({
      'message': 'Hello world!',
      'created_at': FieldValue.serverTimestamp(),
    });

    // Render the widget.
    await tester.pumpWidget(MaterialApp(
        title: 'Firestore Example', home: MyHomePage(firestore: firestore)));
    // Let the snapshots stream fire a snapshot.
    await tester.idle();
    // Re-render.
    await tester.pump();
    // // Verify the output.
    expect(find.text('Hello world!'), findsOneWidget);
    expect(find.text('Message 1 of 1'), findsOneWidget);
  });
}

See more examples at fake_cloud_firestore/example/test/widget_test.dart.

Exceptions
Based on the state

Most features automatically throw exceptions depending on the state, so you do not need to mock them. For example, calling DocumentSnapshot.get on a missing field will throw a StateError.

final firestore = FakeFirebaseFirestore();
final collection = firestore.collection('test');
final doc = collection.doc('test');
await doc.set({
  'nested': {'field': 3}
});

final snapshot = await doc.get();

expect(() => snapshot.get('foo'), throwsA(isA<StateError>()));
expect(() => snapshot.get('nested.foo'), throwsA(isA<StateError>()));
Mocking exceptions

Furthermore, some methods allow mocking exceptions manually, for example to simulate network errors. You can even set conditions on the parameters using the standard Dart matchers. Here are the methods which support mocking exceptions:

  • DocumentReference.get, set, update, delete.
  • Query.get.
final instance = FakeFirebaseFirestore();
final doc = instance.collection('users').doc(uid);
whenCalling(Invocation.method(#set, null))
    .on(doc)
    .thenThrow(FirebaseException(plugin: 'firestore'));
expect(() => doc.set({'name': 'Bob'}), throwsA(isA<FirebaseException>()));

For examples of how to set conditions on when to throw an exception, see firebase_auth_mocks#throwing-exceptions.

Security Rules

You can pass the security rules that you use in production in Firestore to [FakeFirebaseFirestore]. When operating on [DocumentReference] using get, set, update, or delete, [FakeFirebaseFirestore] will then check security rules and throw exceptions if access is restricted. In the example below, we restrict users/{userId} documents to their respective owners. Before they sign in, they cannot access any document inside the users collection. Once they sign in, they have access to only their own users/[uid] document.

import 'package:fake_cloud_firestore/fake_cloud_firestore.dart';
import 'package:firebase_auth_mocks/firebase_auth_mocks.dart';
import 'package:test/test.dart';

// https://firebase.google.com/docs/rules/rules-and-auth#leverage_user_information_in_rules
final authUidDescription = '''
service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}''';

main() async {
  test('security rules' {
    final auth = MockFirebaseAuth();
    final firestore = FakeFirebaseFirestore(
        // Pass security rules to restrict `/users/{user}` documents.
        securityRules: authUidDescription,
        // Make MockFirebaseAuth inform FakeFirebaseFirestore of sign-in
        // changes.
        authObject: auth.authForFakeFirestore);
    // The user signs-in. FakeFirebaseFirestore knows about it thanks to
    // `authObject`.
    await auth.signInWithCustomToken('some token');
    final uid = auth.currentUser!.uid;
    // Now the user can access their user-specific document.
    expect(
        () => firestore.doc('users/$uid').set({'name': 'abc'}), returnsNormally);
    // But not anyone else's.
    expect(() => firestore.doc('users/abcdef').set({'name': 'abc'}),
        throwsException);
  });
}

See https://github.com/atn832/fake_cloud_firestore/blob/master/test/security_test.dart for more examples of security rules.

Right now we only support operations on DocumentReference. Later we will implement security checks for batch requests, collections and queries. Furthermore, we do not support timestamps and durations yet. See Fake Firebase Rules for an exhaustive list of what is and is not supported.

Resetting security rules

You can also dynamically change the security rules. This is useful if you want to first set up data without any restriction, then apply security rules for the actual tests.

https://github.com/atn832/fake_cloud_firestore/blob/0bd0b648241c0ed3e6eac2c26eef85135e3e47f9/test/security_test.dart#L82-L85

Features

  • Dump the state of the fake firebase with FakeFirebaseFirestore.dump().
  • Clear the fake firebase with FakeFirebaseFirestore.clearPersistence().
  • Create documents and collections.
  • Supports Converters.
  • Create documents with collection.add or document.set.
  • Batch writes and runTransaction.
  • Query documents with collection.snapshots or query.get.
  • Queries:
    • Filter results with query.where. The library supports equals, isGreaterThan, isGreaterThanOrEqualTo, isLessThan,isLessThanOrEqualTo, isNull, isNotEqualTo, arrayContains, arrayContainsAny, whereIn and whereNotIn.
    • Supports filtering by special fields like FieldPath.documentId and __name__.
    • Sort results with query.orderBy.
    • Limit results with query.limit, limitToLast, startAfterDocument, startAt, startAtDocument, endAt, endAtDocument, endBefore, endBeforeDocument. Note: startAnd and endAt work only on exact matches.
    • Filter with Filter, including composite filters like Filter.and and Filter.or.
    • Aggregate with query.count, query.aggregate(sum(field1), average(field2)...).
  • ValueField:
    • set timestamps with FieldValue.serverTimestamp(). Optionally you can pass a Clock when instantiating FakeFirebaseFirestore to define what time gets set.
    • delete values with FieldValue.delete().
    • update numerical values with FieldValue.increment.
    • update arrays with FieldValue.arrayUnion and FieldValue.arrayRemove.
  • Mock exceptions for DocumentReference.set.
  • Security rules:
    • Initialize FakeFirebaseFirestore with custom security rules.
    • FakeFirebaseFirestore takes authentication state from firebase_auth_mocks into account.
    • Reset security rules.
    • DocumentReference.get, set, update and delete are protected.

Compatibility table

cloud_firestore fake_cloud_firestore
6.7.1 4.2.0
6.2.0 4.1.0
6.0.0 4.0.0
5.0.0 3.0.0
4.17.0 2.5.0
4.4.0 2.4.0
4.0.0 2.0.0
3.4.0 1.3.0
3.0.0 1.2.1
2.2.0 1.1.0
2.1.0 1.0.2
1.0.0 0.8.4
0.16.0 0.6.0
0.14.0 0.5.0
0.13.1+1 0.4.1
0.13.0+1 0.2.5
^0.12.9+6 0.2.0

Features and bugs

Please file feature requests and bugs at the issue tracker.

所屬分類

依賴

依賴清單 10 項

原始碼儲存庫

使用此套件的專案