2017-11-15 23 views
0

Fireworks 용 Cloud Functions 프로젝트에서 GeoFire를 사용하고 있습니다. 단위 테스트를 원합니다. 내 원래의 코드 GeoFire에서firefox 프로젝트의 Cloud Functions에서 sinon을 사용하여 node.js에 생성자를 스텁링 할 수 있습니까?

은 다음과 같이 사용됩니다

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()에 대한 호출을 모두 스텁 할 필요가 세트() 메소드..

내가 시도 :

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 행에서 발생합니다.

사인 문서보기 내가 객체의 방법을 스터핑 할 수 있음을 이해했습니다. 그러나이 경우 GeoFire는 객체가 아닙니다. 이것은 생성자 함수입니다. 그래서 나는 관련된 객체를 갖지 않고 그것을 어떻게 스텁링 할 수 있는지 정말로 모른다.

감사합니다.

답변

0

GeoFire은 생성자이지만 set은 인스턴스 메소드입니다. 당신은 스터브 GeoFire.prototype을 믿어야합니다.

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

감사합니다 그

// 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

당신은

+0

좋은 대답, 감사합니다! 이 작품! :-) 나는 geoFire 모듈을 필요로하고 export 한 추가적인 모듈을 생성함으로써이 문제를 해결할 수 있었다. 그래서 나는 다음과 같은 것을 할 수 있었다 : const geofireStub = sinon.stub (modules, 'GeoFire'). returns ({set : setStub}). 그게 실제로 효과가 있지만, 당신의 솔루션이 더 좋다고 생각하고 또한 스텁이 무엇인지 어떻게 해석하는지 정확하게 해석하는 것 같습니다. –

+0

우우, 미안, 내가 잘못 테스트 했어. 위에서 설명한 것처럼 geofire 모듈이 포함 된 새 모듈을 작성하여 코드를 작성했습니다. 내 코드가 자신의 것과 같도록 변경했을 때 geoFireStub.set.resolves() 행에서 "TypeError : 속성을 읽을 수 없습니다 '가 정의되지 않음"이라는 오류가 발생했습니다. –

+0

GeoFire가 생성자이고 geoFireStub에 모든 프로토 타입 메소드 (스텁을 통해)가 포함되어 있는지 확인해야합니다. console.log를 사용하여 geoFireStub가 –