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(....)
        });

显然这不是正确的方法,有谁知道如何在 karma 中测试 $timeout 和 setInterval 吗?

4

1 回答 1

9

更新:在 Angular 1.2+ 应用程序中模拟 setInterval 的正确方法是使用 Angular 的$interval服务。使用该$interval服务提供了许多好处,但在这种情况下最常用的是$interval.flush()方法。在编写测试时,$interval公开一个.flush()允许您模拟 JS 时钟的方法。

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 文档,您应该能够只使用该jasmine.Clock.useMock()函数来模拟典型的 javascript 时钟并手动完成间隔。由于 angular 只是包装了本机setTimeout函数,我非常肯定它应该允许它工作,尽管我还没有测试它来确定。

1.3 版的 jasmine 文档在这里。这是演示其工作原理的代码示例。

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 回答