Функции 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