2017-11-15 4 views
0

Ich verwende GeoFire in einem Cloud-Funktionen für Firebase-Projekt Ich möchte Unit-Test. .Wie kann ich einen Konstruktor in node.js mit sinon in einem Cloud Functions for Firebase-Projekt stubben?

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(); 
    }); 

ich sowohl den Anruf an den GeoFire Konstruktor und der GeoFire (es)() -Methode Stummel müssen:

In meinem ursprünglichen Code GeoFire wird wie folgt verwendet.

Ich habe versucht:

const geofireStub = sinon.stub(GeoFire, 'set').resolves(); 

Aber ich erhielt den Fehler:

TypeError: Cannot stub non-existent own property set 

ich auch versucht:

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

Und ich erhalte den Fehler:

TypeError: Cannot stub non-existent own property set 

Beide Fehler treten in der geofireStub-Leitung auf.

Lesen der Sinon-Dokumentation Ich verstand, dass ich die Methoden eines Objekts stub. In diesem Fall ist GeoFire jedoch kein Objekt. es ist eine Konstruktorfunktion. Ich weiß also nicht wirklich, wie ich es stubben kann, ohne ein zugehöriges Objekt zu haben.

Danke!

Antwort

0

GeoFire ist der Konstruktor, aber set ist eine Instanzmethode. Sie sollten stub GeoFire.prototype ich glaube.

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

Thank you! Ich probierte das und empfange immer noch den selben "Fehler nicht vorhandenen eigenen Eigenschaftssatz" Fehler. Außerdem muss ich den Konstruktor Anruf selbst stub ... –

0

Sie benötigen etwas wie das

// 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(); 
 
    ... 
 

 
    }) 
 
})

+0

oooh nette Antwort, danke! Das funktioniert! Ich habe es geschafft, das Problem zu lösen, indem ich ein zusätzliches Modul erstellte, das das GeoFire-Modul benötigte und exportierte, so dass ich etwas wie const geofireStub = sinon.stub (Module, 'GeoFire') tun konnte. setStub}). Das hat tatsächlich funktioniert, aber ich denke, deine Lösung ist besser und scheint auch richtig zu interpretieren, was ein Stub ist und wie er sie erstellt. –

+0

ugh Entschuldigung, ich habe herausgefunden, dass ich falsch getestet habe. Ich ließ meinen Code arbeiten, indem ich ein neues Modul erstellte, das das GeoFire-Modul enthielt, wie ich oben erklärte. Als ich meinen Code so geändert habe, dass er wie deiner ist, habe ich den Fehler "TypeError: Kann Eigenschaft nicht lesen 'löst' von undefined" aus der Zeile "geoFireStub.set.resolves()". –

+0

Sie müssen sicherstellen, dass GeoFire ein Konstruktor ist und geoFireStub alle Prototyp-Methoden enthält (via Stubs). Benutze einfach console.log, um zu sehen, dass geoFireStub –

Verwandte Themen