4
app.directive('shuffleBlocks', function($timeout){
    return {
        link: function(sco,ele,att){
            if (itemCnt <= 1) return;

            /*Trigger function*/
            function triggerEvent(){
                ...
            }
            ele.bind('click', triggerEvent);

            setInterval(triggerEvent, 5000);
        }
    }
})

ここで私はテストを書きました

        var elem = '<div shuffle-blocks><div>';
        elem = mockCompile(elem)(rootScope.$new());
        setInterval(function(){
            expect(......).toBe(....)
        });

明らかにこれは正しい方法ではありません。カルマで $timeout と setInterval をテストする方法を知っている人はいますか?

4

1 に答える 1

9

更新: 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 を使用している場合は、ここで更新されたドキュメントを参照してください

于 2013-10-22T02:23:04.537 に答える