在单元测试期间无法模拟admin.firestore()

Sam*_*uel 12 javascript unit-testing sinon firebase-admin google-cloud-firestore

我正在阅读如何为firebase模拟谷歌云功能,并且有正确模拟以下代码的问题:

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();
Run Code Online (Sandbox Code Playgroud)

链接中的示例使用以下代码来模拟initializeApp哪些工作正常

admin = require('firebase-admin');
adminInitStub = sinon.stub(admin, 'initializeApp');
Run Code Online (Sandbox Code Playgroud)

现在admin.firestore在firebase-namespace.js中定义如下:

Object.defineProperty(FirebaseNamespace.prototype, "firestore", {
    get: function () {
        var ns = this;
        var fn = function (app) {
            return ns.ensureApp(app).firestore();
        };
        return Object.assign(fn, require('@google-cloud/firestore'));
    },
    enumerable: true,
    configurable: true
});
Run Code Online (Sandbox Code Playgroud)

我已经尝试了各种各样的东西来存根,但我失败了

  1. 结果firestore is not a function:

        Object.defineProperty(admin, "firestore", {
            get: function () {
                return 32;
            }
        });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根本不模拟firestore()并调用失败的原始函数:

        sinon.stub(admin, 'firestore').returns({get() { }});
    
    Run Code Online (Sandbox Code Playgroud)
  3. TypeError:不能存根不存在的自有属性get

       firestoreStub = sinon.stub(admin.firestore, 'get').callsFake(function () {return {data:"Foo"}});
    
    Run Code Online (Sandbox Code Playgroud)

我不了解究竟admin.firebase()是什么.它看起来不像是属性,因为AFAI当我模拟属性的getter时,我会调用admin.firebase而不是函数admin.firebase().但它也不能通过函数来​​模拟.

Sam*_*uel 17

那真的花了我太久了.

为了能够模拟admin.firebase()属性的getter函数,实际上应该返回一个函数.

我最初的假设是,这firebase()是一个功能,它不是.然后通过查看实现我理解这是一个带有自定义getter的属性.但是我试图通过getter返回一些json数据块.

我最初没有理解这admin.firestore确实是一个属性,但我错过了为什么我必须将属性作为一个函数调用的关键,这通常是属性本身不需要的.

在达到这一点之后,我明白了属性的getter实际上返回了一个函数,并且admin.firebase()可以读取

var method = admin.firebase; // calling the property getter function
method(); // assuming the getter returned a function object
Run Code Online (Sandbox Code Playgroud)

所以对于我未来的自我;)这就是诀窍:

sinon.stub(admin, 'firestore')
   .get(function() { 
       return function() { 
           return "data";
       }
   });
Run Code Online (Sandbox Code Playgroud)

最初我是想做的

sinon.stub(admin, 'firestore').get( function () { return "data"; } );失败了,因为admin.firestore()最终屈服了"data"(),这没有任何意义.

  • 请注意,如果您执行这种存根操作,则会破坏功能为:“ test.firestore.makeDocumentSnapshot()”。 (2认同)