繁体   English   中英

Firebase功能:脱机测试时如何对Firebase-admin功能进行存根

[英]Firebase functions: How to stub firebase-admin functions when testing offline

尝试在此处https://firebase.google.com/docs/functions/unit-testing跟随文档测试Firease功能,但尚不清楚如何使用sinon存入firebase-admin.database。 我在下面提供了此错误的功能代码,mocha测试和控制台输出。 从错误输出中可以看到该函数被称为admin.initializeApp(); 被调用,但尚未在测试中正确地存根。

功能码:

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

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();   

// add new users to the database
exports.account = functions.auth.user().onCreate(event => {
  // console.log('addAccount()', event);
  const { uid, providerData } = event;
  const email = providerData[0].email;

  return admin
    .database()
    .ref('/users/' + uid)
    .set({ email, uid });
});

测试以重现该问题:

const sinon = require('sinon');
const chai = require('chai');
const assert = chai.assert;
const admin = require('firebase-admin');
const test = require('firebase-functions-test')();

describe('Cloud Functions', () => {
  let myFunctions, adminInitStub, adminDatabaseStub;

  before(() => {
    adminInitStub = sinon.stub(admin, 'initializeApp');
    adminDatabaseStub = sinon.stub(admin, 'database');
    myFunctions = require('../index');
  });

  after(() => {
    adminInitStub.restore();
    adminDatabaseStub.restore();
    test.cleanup();
  });

  describe('account', () => {
    it('should write to /users', () => {
      // given
      const setParam = { email: 'test@test.com', uid: 1234 };

      const setStub = sinon.stub();
      setStub.withArgs(setParam).returns(true);

      const refStub = sinon.stub();
      refStub.withArgs('/users/1234').returns({ set: setStub });

      adminDatabaseStub.returns({ ref: refStub });

      const wrapped = test.wrap(myFunctions.account);

      const event = {
        uid: 1234,
        providerData: [{
          email: 'test@test.com'
        }]
      };

      // when
      const actual = wrapped(event);

      // then
      return assert.equal(actual, true);
    });
  });
});

控制台错误

Cloud Functions
    account
      1) should write to /users


  0 passing (53ms)
  1 failing

  1) Cloud Functions
       account
         should write to /users:
     Error: The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services.
      at FirebaseAppError.FirebaseError [as constructor] (node_modules/firebase-admin/lib/utils/error.js:42:28)
      at FirebaseAppError.PrefixedFirebaseError [as constructor] (node_modules/firebase-admin/lib/utils/error.js:88:28)
      at new FirebaseAppError (node_modules/firebase-admin/lib/utils/error.js:122:28)
      at FirebaseNamespaceInternals.app (node_modules/firebase-admin/lib/firebase-namespace.js:101:19)
      at FirebaseNamespace.app (node_modules/firebase-admin/lib/firebase-namespace.js:402:30)
      at FirebaseNamespace.ensureApp (node_modules/firebase-admin/lib/firebase-namespace.js:418:24)
      at FirebaseNamespace.fn (node_modules/firebase-admin/lib/firebase-namespace.js:280:30)
      at Function.exports.account.functions.auth.user.onCreate.event [as run] (index.js:65:21)
      at wrapped (node_modules/firebase-functions-test/lib/main.js:68:30)
      at Context.it (test/index.test.js:45:22)

更新adminDatabaseStub.get()以返回getterFn()函数,然后该函数返回ref存根。 谢谢@ hiranya-jayathilaka

之前

      adminDatabaseStub.returns({ ref: refStub });

adminDatabaseStub.get(function getterFn() {
        return () => {
          return { ref: refStub };
        };
      });

admin.database存根必须返回一个可调用对象,以便admin.database()起作用。 admin.database实际上是SDK中的属性获取器。 有关示例和相关讨论,请参见https://github.com/firebase/firebase-admin-node/issues/122#issuecomment-339586082

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM