Функции Firebase позволяют программно управлять данными Firestore и манипулировать ими.

В этой статье мы рассмотрим несколько примеров модульного тестирования этих функций, используя онлайн-тестирование, рекомендуемый подход к тестированию от команды Firebase. Модульное онлайн-тестирование представляет собой сочетание модульного и интеграционного тестирования, когда наши тесты считывают и записывают данные из работающего экземпляра Firebase для тестирования.

Создание вашего проекта

Настройка Firebase

Первое, что вам нужно сделать, это создать тестовый экземпляр Firebase. Сначала перейдите на https://console.firebase.google.com/ и создайте новый проект. Затем включите функции Firestore и Firebase.

Затем перейдите к /settings/general и создайте новое веб-приложение (JavaScript). Скопируйте объект firebaseConfig, который он дает вам после создания вашего приложения, и сохраните его на потом.

Как только это будет сделано, перейдите в настройки проекта и создайте новый ключ сервера в разделе settings/serviceaccounts/adminsdk settings. Загрузите этот ключ и скопируйте его в functions/conf/test-key.json.

Создайте свой локальный проект

Как только ваш тестовый экземпляр настроен, вы готовы начать кодирование.

Вам понадобится Firebase CLI (https://firebase.google.com/docs/cli), чтобы продолжить работу с этим руководством, поэтому установите его сейчас, если он еще не установлен.

Для начала создайте новую папку для своего проекта, файл initialize Firebase.

mkdir task-demo
cd task-demo
firebase init

Клиент Firebase CLI поможет вам настроить ваше приложение. Когда вам будет предложено выбрать функции, выберите functions , нам не нужны никакие другие функции для этой демонстрации.

Настройка тестирования

Мы собираемся использовать основные тесты функций Firebase, расширенные с помощью FirestoreTest, тестового пакета, который упрощает создание и управление тестовыми базами данных в Firestore.

npm i mocha, chai, @dig-platform/firestore-test

Теперь добавьте скрипт в package.json для запуска тестов:

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    //...
    "test": "mocha --timeout=5000  **/*.spec.js",
    //...
  }
}

С этим мы готовы писать код!

Создайте свою функцию

Сначала мы собираемся создать очень простой триггер Firestore, который автоматически устанавливает приоритет задачи на low, если он еще не установлен. Создайте файл с именемfunctions/tasks/tasks.js и добавьте в него следующую функцию:

// require firebase functions
const functions = require('firebase-functions');

// create onCreate firestore trigger for the tasks collection
exports.tasks = functions.firestore
    .document('tasks/{docID}')
    .onCreate((change, context) => {
        // get the document's data
        const data = change.data();
        // make priority default to low
        if (! data.priority) {
            // create the patch
            const patch = {priority: 'low'};

            // apply the patch to the Firestore ref
            return change.ref.set(patch, {merge: true});
        }
        return;
    });

Модульное тестирование триггера Firestore

Начните с создания нового тестового файла с именем functions/tasks/tasks.spec.js.

Настройка FirestoreTest

Первый шаг — указать FirestoreTest на только что созданный проект Firebase. Скопируйте настройки из объекта firebaseConfig.

// configure your testing environment to point to the testing firebase instance
const firestoreTest = require('@dig-platform/firestore-test')({
    databaseURL: '###',
    storageBucket: '###',
    projectId: '###',
}, 'conf/test-key.json');

Затем потребуйте остальную часть кода, необходимого вашему тесту.

// get the core firebase testing utilities
const test = firestoreTest.firebaseTest();

// use chai testing package
const {assert} = require('chai');

// require the task function
const {tasks} = require('./tasks');

Создание вашей тестовой функции

Теперь создайте тестовую функцию для проверки триггера Firebase Firestore.

Чтобы протестировать эту функцию, нам нужно создать FirestoreTest testDb с тестовым документом в коллекции tasks.

Затем нам нужно создать снимок, который мы вставим в функцию.

Как только мы это сделали, мы готовы протестировать функцию. Мы делаем это с помощью функции firebase test wrap, которая обрабатывает для нас вызов триггера Firestore.

Затем нужно просто получить окончательное состояние документа задачи и записать любые необходимые утверждения Chai.

describe('Firestore task onCreate', () => {
    before(() => {
        // setup the test
    });
    after(() => {
        // tear down the test
        test.cleanup();
    });

    describe('task()', () => {
        it('should set the priority to low if it is not set', async () => {
            const refPath = 'task/test-data';
            const db = await firestoreTest.testDb({
                [refPath]: {
                    label: 'Get the milk',
                    done: false
                }
            });
            const snap = db.makeDocumentSnapshot(refPath);
            const wrapped = test.wrap(tasks);
            return wrapped(snap).then(async (d) => {
                const task = await db.after(refPath);
                assert.equal(task.priority, 'low')
            });
        });
    });
});

Запуск модульных тестов Firebase

Теперь, когда вы создали тест, вы можете запустить его с помощью тестового скрипта npm:

npm run test

Узнать больше

Некоторые документы по тестированию Firebase ссылаются на предыдущую базу данных Realtime Database, но в документации по тестированию Firebase https://firebase.google.com/docs/functions/unit-testing есть много полезной информации.

Вы можете просмотреть полный исходный код из этого руководства на GitHub: https://github.com/dig-platform/firestore-test/tree/master/examples/firestore-on-create