Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Firebase项目的云函数中使用sinon在node.js中存根构造函数?_Node.js_Firebase_Sinon_Google Cloud Functions_Geofire - Fatal编程技术网

如何在Firebase项目的云函数中使用sinon在node.js中存根构造函数?

如何在Firebase项目的云函数中使用sinon在node.js中存根构造函数?,node.js,firebase,sinon,google-cloud-functions,geofire,Node.js,Firebase,Sinon,Google Cloud Functions,Geofire,我在Firebase项目的云函数中使用GeoFire,我想进行单元测试 在我的原始代码中,GeoFire的用法如下: GeoFire = request('geofire'); ... var catGeoFire = new GeoFire(catGeofireRef); return catGeoFire.set(storeId, [lat, lon]).then( () => { console.log("Added store " + storeId + " to Ge

我在Firebase项目的云函数中使用GeoFire,我想进行单元测试

在我的原始代码中,GeoFire的用法如下:

GeoFire = request('geofire');

...

var catGeoFire = new GeoFire(catGeofireRef);
return catGeoFire.set(storeId, [lat, lon]).then( () => {
    console.log("Added store " + storeId + " to GeoFire" );
        return Promise.resolve();
    });
我需要对GeoFire构造函数和GeoFire().set()方法的调用进行存根

我试过:

const geofireStub = sinon.stub(GeoFire, 'set').resolves();
但我收到了错误:

TypeError: Cannot stub non-existent own property set
TypeError: Cannot stub non-existent own property set
我还尝试:

const setStub = sinon.stub().resolves();
const geofireStub = sinon.stub(GeoFire).returns({set: setStub});
我收到了错误信息:

TypeError: Cannot stub non-existent own property set
TypeError: Cannot stub non-existent own property set
这两个错误都发生在geofireStub行

阅读sinon文档后,我明白我可以存根对象的方法。然而,在这种情况下,GeoFire不是一个对象;它是一个构造函数。所以我真的不知道如何在没有关联对象的情况下存根它


谢谢

GeoFire
是构造函数,而
set
是实例方法。 我相信你应该使用GeoFire.prototype

sinon.stub(GeoFire.prototype,'set').resolves();

您需要这样的东西,使用:

//target.js
var GeoFire=需要(“GeoFire”);
var CATGEOFIER=新的GEOFIER(CATGEOFIEREF);
返回catGeoFire.set(storeId,[lat,lon]),然后(()=>{
console.log(“向GeoFire添加了存储”+存储ID+);
返回承诺。解决();
});
//test.js
var GeoFire=需要(“GeoFire”);
var rewire=require('rewire')
变量目标=重新布线('./目标')
描述('target',()=>{
它('测试用例',()=>{
//安排
//配置实例
var geoFireStub=sinon.createStubInstance(GeoFire)
geoFireStub.set.resolves()
//配置构造函数
var GeoFireMock=sinon.stub().返回(geoFireStub)
//“GeoFire”在这里是一个模拟变量
var revert=重新布线('GeoFire',GeoFireMock)
//act(呼叫测试模块)
目标()
//断言(应仅作为示例)
应(GeoFireMock)。调用WithNew(/*params*/)
应(geoFireStub.set)。使用(/*params*/)调用
//清理(重新布线和存根,更喜欢使用沙箱)
回复();
...
})

})
谢谢!我尝试了这个,但仍然收到相同的“不能存根不存在自己的属性集”错误。另外,我还需要存根构造函数调用本身…哦,回答得好,谢谢!这很有效!:-)我已经通过创建一个需要并导出GeoFire模块的附加模块来解决了这个问题,因此我可以执行如下操作:const geofireStub=sinon.stub(modules,'GeoFire')。returns({set:setStub})。这确实有效,但我认为您的解决方案更好,而且似乎能够正确解释什么是存根以及如何创建存根。我创建了一个包含geofire模块的新模块,使我的代码正常工作,如上所述。当我将代码更改为您的代码时,我从geoFireStub.set.resolves()行收到错误“TypeError:无法读取未定义的属性'resolves'。您需要确保GeoFire是一个构造函数,并且geoFireStub包含所有原型方法(通过stubs)。只需使用console.log就可以看到geoFireStub isI记录了GeoFire并获得以下描述:{[Function:GeoFire]distance:[Function]}“更喜欢使用沙盒”——我相信这是一个很多人都会喜欢的例子