2017-11-15 17 views
0

FireFoxのクラウドファンクションプロジェクトで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

ようなものが必要!私はこれを試して、同じ "まだ存在しないプロパティセットをスタブすることはできません"エラーを受け取ります。また、コンストラクタ呼び出し自体をスタブする必要があります... –

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

おっといい答え、ありがとう!これは動作します! :-)私はGeoFireモジュールを必要とし、エクスポートした追加のモジュールを作成することで問題を解決できたので、私は何かできるようになりました:const geofireStub = sinon.stub(modules、 'GeoFire')。returns({set: setStub})。それは実際にはうまくいきましたが、あなたのソリューションは優れていると思いますし、スタブとその作成方法を正しく解釈しているようです。 –

+0

um申し訳ありませんが、私は間違ってテストしていました。上で説明したように、geofireモジュールを含む新しいモジュールを作成してコードを作成しました。私のコードをあなたのように変更したとき、私はエラー "TypeError:プロパティを読み取ることができません 'のundefinedの解決"をgeoFireStub.set.resolves()行から受け取りました。 –

+0

GeoFireがコンストラクタであり、geoFireStubにすべてのプロトタイプメソッド(スタブ経由)が含まれていることを確認する必要があります。 console.logを使用してgeoFireStubが –

関連する問題