更新: angular 1.2+ アプリケーションで setInterval をモックする適切な方法は、angular の$interval
サービスを使用することです。この$interval
サービスを使用すると多くの利点が得られますが、この状況で最も使用されるのは$interval.flush()
方法です。テストを記述するときに、JS クロックをモックできるメソッドを$interval
公開します。.flush()
app.directive('shuffleBlocks', function($timeout, $interval){
return {
link: function(sco,ele,att){
if (itemCnt <= 1) return;
/*Trigger function*/
function triggerEvent(){ ... }
ele.bind('click', triggerEvent);
$interval(triggerEvent, 5000);
}
}
});
次に、単体テストで:
var elem = '<div shuffle-blocks><div>';
elem = mockCompile(elem)(rootScope.$new());
$interval.flush(5000); // flush accepts the # of ms to be flushed
expect(......).toBe(....);
将来この回答を調べる人に役立つことを願っています。まだ 1.1X を使用している人のために、以前の回答を残しておきます。
前の回答: jasmine docsによると、jasmine.Clock.useMock()
関数を使用して典型的な JavaScript クロックをモックし、間隔を手動で操作できるはずです。angularはネイティブsetTimeout
関数をラップしているだけなので、確実にテストしていませんが、これが機能するはずだと確信しています。
バージョン 1.3 のジャスミンのドキュメントはこちらです。これがどのように機能するかを示すコード例を次に示します。
beforeEach(function() {
timerCallback = jasmine.createSpy('timerCallback');
jasmine.Clock.useMock();
});
it("causes a timeout to be called synchronously", function() {
setTimeout(function() {
timerCallback();
}, 100);
expect(timerCallback).not.toHaveBeenCalled();
jasmine.Clock.tick(101);
expect(timerCallback).toHaveBeenCalled();
});
私が見る唯一の問題は、あなたのtriggerEvent()
関数がリンク関数に対してローカルであるため、どのようにしてそれをモックすることができるのかわかりません。しかし、うまくいけば、それはあなたを正しい方向に向けます. そうでない場合は、申し訳ありませんが、試しました。
更新:時計をモックするための構文が で変更されましたJasmine 2.0
。2.0 を使用している場合は、ここで更新されたドキュメントを参照してください。