如何在Cloud Functions for Firebase项目中使用sinon在node.js中存根构造函数



我在一个要进行单元测试的Firebase项目的Cloud Functions中使用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

我也试过:

const setStub = sinon.stub().resolves();
const geofireStub = sinon.stub(GeoFire).returns({set: setStub});

我收到错误:

TypeError: Cannot stub non-existent own property set

这两个错误都发生在geofireStub线上。

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

谢谢!

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

// target.js
var GeoFire = require('geofire');
var catGeoFire = new GeoFire(catGeofireRef);
return catGeoFire.set(storeId, [lat, lon]).then(() => {
console.log("Added store " + storeId + " to GeoFire" );
return Promise.resolve();
});

// test.js
var GeoFire = require('geofire');
var rewire = require('rewire')
var target = rewire('./target')
describe('target', () => {
it('test case', () => {
// arrange
// configure instance
var geoFireStub = sinon.createStubInstance(GeoFire)
geoFireStub.set.resolves()
// configure constuctor
var GeoFireMock = sinon.stub().returns(geoFireStub)
// 'GeoFire' is a mocked variable here
var revert = rewire('GeoFire', GeoFireMock)
// act (call tested module)
target()
// assert (should is just for example)
should(GeoFireMock).calledWithNew(/* params*/)
should(geoFireStub.set).calledWith(/* params*/)
//cleanup (rewire and stubs, prefer to use sandbox)
revert();
...
})
})

GeoFire是构造函数,但set是实例方法。我认为你应该截去GeoFire.prototype

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

最新更新