单元测试 firebase 功能:如何存根 firebase-admin sdk

use*_*644 5 javascript unit-testing sinon firebase firebase-realtime-database

在index.js中,我有以下内容

exports.write = functions.https.onRequest((req, res) => {
    admin.database()
        .ref(`xxx/yyy`)
        .push()
        .set({timestamp: admin.database.ServerValue.TIMESTAMP});
    res.status(200).end();
});
Run Code Online (Sandbox Code Playgroud)

在我的 test.js 中,我对 admin.database() 进行存根,如下所示:

const refStub = sinon.stub();
setStub = sinon.stub();
refStub.withArgs('xxx/yyy').returns({push: () => ({key: 'fakeKey', set: setStub})});
databaseStub = sinon.stub(admin, 'database').get(() => {
    return () => {
      return {ref: refStub};
    };
  });
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,出现以下错误TypeError: Cannot read property 'TIMESTAMP' of undefined。如何修复此错误或将调用存根到admin.database.ServerValue.TIMESTAMP?谢谢。

use*_*644 3

在 JavaScript 中,函数可以具有属性。

> function x() {}
undefined
> x
[Function: x]
> x.prop = 1
1
> x
{ [Function: x] prop: 1 }
> 
Run Code Online (Sandbox Code Playgroud)

有了这些知识,存根 admin.database 就很简单了

var databaseStub = sinon.stub(admin, 'database').returns({ref: refStub});
//monkey patch database()'s property
admin.database.ServerValue = {TIMESTAMP: '1111'};
Run Code Online (Sandbox Code Playgroud)

感谢Doug Stevenson在 firebase slack 频道上向我指出了这一点。谢谢道格!