2017-03-22 26 views
1

setInterval呼び出しのテストをセットアップしようとしています。 setIntervalは常に新しいタイマーを作成するので、tick()を先に移動しても、常にこのメッセージでエラーが発生します。jasmineを使用してsetIntervalを使用する角度サービスをテストするにはどうすればよいですか?

エラー:1つのタイマーがキューに残っています。

setTimeout関数をsetIntervalでオーバーライドすると、テストは正常に実行されます。私は通常、setIntervalに設定されているパブリックプロパティmyTimerFuncを使用して、これを私の角度サービスに許可するコードを追加しました。テストコードはsetTimeoutに設定します。

setIntervalをテストする良い方法はありますか?

キューの最後のタイマーがジャスミンによって無視されるといいでしょう。その後、私は余分な亀裂なしでテストすることができました。

たとえば、setIntervalをオーバーライドする行のコメントを解除しない限り、このコードは失敗します。私はテストコードでこれをやっても構いませんが、このオーバーライドを可能にするために、通常のコードに余分なものを加えることを避けたいと思います。

import { fakeAsync, tick } from '@angular/core/testing' 
 
describe('testing setTimeout and setInterval:',() => { 
 
it('setTimeout should work', fakeAsync(() => { 
 
    let callback = jasmine.createSpy('setTimeoutCallback') 
 
    setTimeout(() => { 
 
    callback() 
 
    }, 55) 
 
    tick(56) 
 
    expect(callback).toHaveBeenCalled(); 
 
})); 
 
// let setInterval = setTimeout 
 
it('setInterval should work', fakeAsync(() => { 
 
    let callback = jasmine.createSpy('setTimeoutCallback') 
 
    setInterval(() => { 
 
    callback() 
 
    }, 55) 
 
    tick(56) 
 
    expect(callback).toHaveBeenCalled(); 
 
})); 
 
})

答えて

0

あなたがサービスでsetIntervalを包んだ場合は、サービスを模擬でき、すべてが副作用なしで、決定論的になります。基本的にはあなただけ

class IntervalService { 

    setInterval(callback:() => void, interval: number) { 
    return setInterval(callback, interval); 
    } 

    clearInterval(intervalId: number) { 
    clearInterval(intervalId); 
    } 
} 

ような何かをしたい、あなたがそれを模擬可能性の方法は、その後、あなたのテストで、あなたはモックサービスにtickを呼び出すことによって、間隔を制御することができ

class MockIntervalService { 
    callback; 

    setInterval(callback:() => any, interval: number) { 
    this.callback = callback; 
    return 1; 
    } 

    clearInterval(interval: number) { 
    callback = undefined; 
    } 

    tick() { 
    callback(); 
    } 
} 

ような何かを行うことです。最も重要な点は、すべてが同期しているため、テストが簡単になるということです。

サービスを注入するのに少し余分な作業ですが、それはそれほど負担ではないと思います。

+0

ありがとうございました。私は、setIntervalが繰り返される回数を制限することを検討しているので、あなたの提案はあまり負担にならないことに同意します。 –

関連する問題