Я занимаюсь разработкой облачных функций Firebase, которые должны реагировать на документы, созданные или обновленные в Firebase Firestore.
Я хочу написать интеграционные тесты для этих функций, чтобы быть уверенным, что они работают должным образом, но я застрял при попытке использовать эмулятор Firebase для локального выполнения моих тестов.
Я хочу, чтобы мои тесты запускались только в эмуляторе и не касались рабочей базы данных.
Согласно коду у меня есть простая облачная функция
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.increaseNumberOnNewDoc = functions.firestore.document('mycollection/{newdocid}').onCreate((snap, context) => {
const newDoc = snap.data();
return snap.ref.set({
number: 10,
},
{ merge: true, });
});
Теперь я хочу протестировать функцию с помощью эмулятора, поэтому я создал файл index.test.js в каталоге test со следующим содержимым:
const sinon = require('sinon');
// Require firebase-admin so we can stub out some of its methods.
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const test = require('firebase-functions-test')();
describe('Cloud Functions', () => {
let myFunctions; //, adminInitStub;
before(() => {
adminInitStub = sinon.stub(admin, 'initializeApp');
myFunctions = require('../index.js');
});
after(() => {
test.cleanup();
});
describe('Increase Number for newly created docs', () => {
let oldDatabase;
before(() => {
admin.initializeApp({
projectId: 'sampleid'
})
});
after(() => {
firebase.clearFirestoreData({
projectId: "sampleid"
});
});
it('should increase the number for new docs', (done) => {
return admin.firestore().collection('mycollection').add({
sampleField: 'Unit Test'
}).then((onValue) => onValue.get()).then((onNewData) => assert.equal(onNewData['number'], 2));
});
});
});
Затем я пытаюсь запустить эмулятор и выполнить свой тестовый скрипт, используя
firebase emulators:exec "npm test"
, где npm test
выполняет mocha --reporter spec
В соответствии с документами Запускать функции локально , записи из Cloud Functions, использующие Firebase Admin SDK для записи в Cloud Firestore, будут отправлены в эмулятор Cloud Firestore, если он запущен.
К сожалению, мой тест не работает, и я получаю следующее предупреждение:
Warning, FIREBASE_CONFIG environment variable is missing. Initializing firebase-admin will fail
, а также ошибки после этого:
Error: The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services.
Эти предупреждения / ошибки, похоже, связаны с Узлом 10
FIREBASE_CONFIG не устанавливается, когда развернуты функции Node.js 10 и Переменная среды GCLOUD_PROJECT отсутствует в среде выполнения Node 10 , но кроме этих ошибок (которые в конечном итоге будут исправлены в некоторый момент), это правильный способ тестирования интеграции Триггеры Firestore с функциями Cloud локально, а также на CI?