2016-03-22 8 views
0

私は関数の実行を抑制するために書いたライブラリをテストしています。約束が果たされないことをどうやってテストできますか?

APIはthrottler.do(fn)であり、fnの戻り値の約束を返します(スローラが実行しても問題ないと判断した時点で解決されます)。

私は毎分2つのアクションを許可し、

throttler.do(() => {}); 
throttler.do(() => {}); 
throttler.do(() => {}).should.eventually.equal(5); 

を行うにはスロットラーを設定する場合に予想されるとして、それが最後の約束を待っているので、そう、これは(それがタイムアウト失敗偽物Date()setTimeoutlolexを使用しています永遠に私はlolex.tickと呼ぶことはありません)。

ですそこsetTimeoutメソッドをlolexによって偽造されたので、私は

setTimeout(() => done(), 1500) 

を行うことができない私は通過テストにこれを回すことができる方法、

throttler.do(() => {}).should.never.be.fulfilled; 

のようなもの。

答えて

1

プロミスを同期させて、プロミス状態を確認することができます。ここにあなたが使用できるライブラリがありますpromise-sync

+0

少し詳しく説明できますか?私は図書館の背後にあるアイデアを得るが、それをどのように適用するかはわからない。私の場合、約束は被験者によって返されます。テスト対象のものが返すものを私が馬鹿にすれば、本当にテストすることはできません。 – JonathanR

+0

彼はどのようにプロミスを作りますか? Promise工場を模擬することができます。Qを使って約束を延期すると、 –

+0

が得られます。これは私のアプローチよりはるかに優れています。ありがとうございます。 – JonathanR

-1

これは、より良い解決策がないため、これを終わらせました。

it('stops when the action limit is hit', function(done) { 
    clock.uninstall(); 
    setTimeout(() => done(), 1500); 
    clock = lolex.install(); 
    throttler = new Throttler(2); 
    throttler.do(() => {}); 
    throttler.do(() => {}); 
    throttler.do(() => 5).should.eventually.not.equal(5).notify(done); 
}); 
関連する問題