Как локально протестировать интеграцию Firebase Cloud Function с триггерами для Firestore? - PullRequest
0 голосов
/ 09 июня 2019

Я занимаюсь разработкой облачных функций 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?

...