代码之家  ›  专栏  ›  技术社区  ›  user3240644

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

  •  5
  • user3240644  · 技术社区  · 8 年前

    在索引中。js,我有以下几点

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

    在我的测试中。js,我是存根管理员。数据库(),如下所示:

    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};
        };
      });
    

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   user3240644    8 年前

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

    > function x() {}
    undefined
    > x
    [Function: x]
    > x.prop = 1
    1
    > x
    { [Function: x] prop: 1 }
    > 
    

    有了这些知识,Stubing admin。数据库非常简单

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

    贷记至 Doug Stevenson 在firebase slack频道向我指出了这一点。谢谢Doug!

        2
  •  0
  •   Doug Stevenson    8 年前

    admin.database.ServerValue.TIMESTAMP 不是电话。它是一个值永远不会更改的对象—一个由服务器端的数据库解释的特殊值。如果打印它,它看起来像这样:

    { '.sv': 'timestamp' }
    

    因为它本质上是一个不变的值,永远不会改变,所以不需要嘲笑它。

    而且,我不清楚你是否正确使用了它。您应该将其指定为写入实时数据库的对象的值。