我在一个要进行单元测试的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();