2017-11-13 7 views
0

これは私のコードです。私は "やっている"方法をテストし、this.obj.sendが時間間隔でカウントと呼ばれることを確認したい。Sinon usefaketimerとスパイがカウントミスと呼ばれる

私の問題は、私が_fetchAllDatasというメソッドをスタブして解決したときです。 this.obj.sendを呼び出せませんでした。 this.obj.send_fetchAllDatasの外に移動したとき。それは呼び出すことができます。

どうすればこの問題に対処できますか?ありがとう〜

var sinon = require('sinon'); 


class A { 
    constructor(obj){ 
     this.obj = obj; 
     this.timer; 
    } 

    doing(){ 
     this.timer = setInterval(()=>{ 
      this._fetchAllDatas().then((data)=>{ 
       console.log('!!!',data); 
       this.obj.send(data); 
      }); 
     },1000) 
    } 

    stop(){ 
     clearInterval(this.timer); 
    } 

    _fetchAllDatas(){ 
     return Promise.resolve([]); 
    } 
} 

var sandbox = sinon.sandbox.create(); 
var spy = { send: sandbox.spy()}; 
var a = new A(spy); 
var stub = sandbox.stub(a,'_fetchAllDatas').resolves(['mark']); 
var clock = sandbox.useFakeTimers(); 

a.doing();; 
clock.tick(5000); 
sinon.assert.callCount(spy.send, 5); // error the count is zero. it should be 5 times 

答えて

0

最初に、"call count = 5 times within 5 seconds"の結果は期待どおりに起こりません。 setIntervalのコールバックがN(ms)の遅延時間後にトリガーになるからです。

x = not triggered 
o = triggered 

1s--1s--1s--1s--1s 
x o o o o 
^start   ^end 

第二に、あなたは右の同期呼び出しの後に非同期呼び出しから正しい結果を得ることはありません。それが唯一の下のグラフのように、5秒期間内に4回が起こるのだろう、です 。 あなたがa.doing();を呼び出し、それはなりますが、機能asynchronizeコールバック、this.obj.send(data)を非同期に実行されることを意味し を実行する約束を返すthis._fetchAllDatas() を呼び出しsetInterval(そのためのuseFakeTimers) の同期バージョンを開始します。

clock.tick(5000)を使用しても、依然として非同期呼び出しです。

つまり、プロミスが本当に解決された後、適切なタイミングでアサーションを入れてください。

関連する問題