繁体   English   中英

在Firebase函数中存根auth0

[英]Stubbing auth0 in firebase functions

我具有以下Firebase函数,该函数利用Auth0获取用户个人资料。

'use strict';

const {
    dialogflow,
    Image,
  } = require('actions-on-google')

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

admin.initializeApp(functions.config().firebase);

const db = admin.firestore();

// database collection and key names
const DB_BANK_COLLECTION_KEY = 'bank'
// the action name from all Dialogflow intents
const INTENT_WELCOME_USER = 'Default Welcome Intent';

// Initialize the Auth0 client
var AuthenticationClient = require('auth0').AuthenticationClient;
var auth0 = new AuthenticationClient({
    domain: functions.config().familybank.auth0.domain,
    clientID: functions.config().familybank.auth0.clientid
});

const app = dialogflow();

app.intent(INTENT_WELCOME_USER, async (conv) => {
    console.log('Request: ' + JSON.stringify(conv.request));

    const userInfo = await auth0.getProfile(conv.user.access.token)
    .catch( function(err) {
        console.error('Error getting userProfile from Auth0: ' + err);
        conv.close("Something went wrong. Please try again in a few minutes. " + err)
    });
    console.log('userInfo: ' + JSON.stringify(userInfo));

    // check for existing bank, if not present, create it
    var bankRef = db.collection(DB_BANK_COLLECTION_KEY).doc(userInfo.email);
    const bankSnapshot = await bankRef.get()

})

exports.accessAccount = functions.https.onRequest(app);

我尝试使用以下代码(和几个排列)在测试中模拟auth0,但实际总是调用实际函数而不是模拟。

const chai = require('chai');
const assert = chai.assert;

const sinon = require('sinon');

// Require firebase-admin so we can stub out some of its methods.
const admin = require('firebase-admin');
const test = require('firebase-functions-test')();

var AuthenticationClient = require('auth0').AuthenticationClient;
var auth0 = new AuthenticationClient({
  domain: "mock",
  clientID: "mock"
});

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

  before(() => {
    test.mockConfig({"familybank": {"auth0": {"domain": "mockdomain", "clientid": "mockid"}}});
    adminInitStub = sinon.stub(admin, 'initializeApp');
    sinon.stub(admin, 'firestore')
   .get(function() { 
       return function() { 
           return "data";
       }
    });
    sinon.stub(auth0, 'getProfile').callsFake( function fakeGetProfile(accessToken) {
      return Promise.resolve({"email": "daniel.watrous@gmail.com", "accessToken": accessToken});
    });
    myFunctions = require('../index');
  });

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

  describe('accessAccount', () => {

    it('should return a 200', (done) => {
      const req = {REQUESTDATA};
      const res = {
        redirect: (code, url) => {
          assert.equal(code, 200);
          done();
        }
      };

      myFunctions.accessAccount(req, res);
    });
  });
})

有什么方法可以模拟auth0进行离线测试?

我发现与其初始化Auth0 AuthenticationClient,不如先要求UsersManager,在其中定义getProfile(包装getInfo)。

var UsersManager = require('auth0/src/auth/UsersManager');

然后,在我的before()方法中,可以为getInfo创建一个存根,如下所示

sinon.stub(UsersManager.prototype, 'getInfo').callsFake( function fakeGetProfile() {
  return Promise.resolve({"email": "some.user@company.com"});
});

然后,所有对auth0.getProfile的调用auth0.getProfile返回一个Promise,该Promise会解析为我的存根假函数中显示的文档。

暂无
暂无

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

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