gpt4 book ai didi

unit-testing - 如何在 karma angularjs 中对 setInterval 进行单元测试

转载 作者:行者123 更新时间:2023-12-04 04:42:30 25 4
gpt4 key购买 nike

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?

最佳答案

更新:在 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 docs ,您应该可以只使用 jasmine.Clock.useMock()函数来模拟典型的 javascript 时钟并手动完成间隔。由于 angular 只是包装 native setTimeout功能,我很肯定它应该允许它工作,尽管我还没有测试过它。

1.3 版的 jasmine 文档是 here .下面是演示其工作原理的代码示例。
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,请查看更新的文档 here .

关于unit-testing - 如何在 karma angularjs 中对 setInterval 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com