在单元测试期间无法模拟 admin.firestore()
Cannot mock admin.firestore() during unit tests
我正在阅读 how to mock google cloud functions for firebase 并且遇到了正确模拟以下代码的问题:
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();
link 中的示例使用以下代码模拟 initializeApp
确实有效
admin = require('firebase-admin');
adminInitStub = sinon.stub(admin, 'initializeApp');
现在 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
});
我尝试了各种方法来解决这个问题,但我失败了
firestore is not a function
结果:
Object.defineProperty(admin, "firestore", {
get: function () {
return 32;
}
});
根本不模拟 firestore() 并调用严重失败的原始函数:
sinon.stub(admin, 'firestore').returns({get() { }});
TypeError: 无法存根不存在的自己 属性 get
firestoreStub = sinon.stub(admin.firestore, 'get').callsFake(function () {return {data:"Foo"}});
我不明白 admin.firebase()
到底是什么。它看起来不像是 属性,因为 AFAI 当我模拟 属性 的 getter 时,我会调用 admin.firebase
而不是函数 admin.firebase()
。但它也不能通过函数模拟。
我真的花了太长时间。
为了能够模拟 admin.firebase()
属性 的 getter 函数实际上应该 return 一个函数 。
我最初的假设是 firebase()
是一个函数,但事实并非如此。然后通过查看实现,我了解到这是一个带有自定义 getter 的 属性。但是我试图通过 getter.
return 一些 json 数据块
我最初未能理解 admin.firestore
确实是一个 属性 但我错过了为什么我必须将 属性 作为函数调用的关键,这通常不是属性 本身需要。
说到这里我明白 属性 的 getter 实际上是 return 一个函数, admin.firebase()
可以读成 [=19] =]
var method = admin.firebase; // calling the property getter function
method(); // assuming the getter returned a function object
所以为了我未来的自己 ;) 这就是诀窍:
sinon.stub(admin, 'firestore')
.get(function() {
return function() {
return "data";
}
});
本来想做的
sinon.stub(admin, 'firestore').get( function () { return "data"; } );
失败了,因为 admin.firestore()
最终在 "data"()
屈服了,这毫无意义。
我正在阅读 how to mock google cloud functions for firebase 并且遇到了正确模拟以下代码的问题:
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();
link 中的示例使用以下代码模拟 initializeApp
确实有效
admin = require('firebase-admin');
adminInitStub = sinon.stub(admin, 'initializeApp');
现在 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
});
我尝试了各种方法来解决这个问题,但我失败了
firestore is not a function
结果:Object.defineProperty(admin, "firestore", { get: function () { return 32; } });
根本不模拟 firestore() 并调用严重失败的原始函数:
sinon.stub(admin, 'firestore').returns({get() { }});
TypeError: 无法存根不存在的自己 属性 get
firestoreStub = sinon.stub(admin.firestore, 'get').callsFake(function () {return {data:"Foo"}});
我不明白 admin.firebase()
到底是什么。它看起来不像是 属性,因为 AFAI 当我模拟 属性 的 getter 时,我会调用 admin.firebase
而不是函数 admin.firebase()
。但它也不能通过函数模拟。
我真的花了太长时间。
为了能够模拟 admin.firebase()
属性 的 getter 函数实际上应该 return 一个函数 。
我最初的假设是 firebase()
是一个函数,但事实并非如此。然后通过查看实现,我了解到这是一个带有自定义 getter 的 属性。但是我试图通过 getter.
我最初未能理解 admin.firestore
确实是一个 属性 但我错过了为什么我必须将 属性 作为函数调用的关键,这通常不是属性 本身需要。
说到这里我明白 属性 的 getter 实际上是 return 一个函数, admin.firebase()
可以读成 [=19] =]
var method = admin.firebase; // calling the property getter function
method(); // assuming the getter returned a function object
所以为了我未来的自己 ;) 这就是诀窍:
sinon.stub(admin, 'firestore')
.get(function() {
return function() {
return "data";
}
});
本来想做的
sinon.stub(admin, 'firestore').get( function () { return "data"; } );
失败了,因为 admin.firestore()
最终在 "data"()
屈服了,这毫无意义。