单元测试 – 如何在karma angularjs中对setInterval进行单元测试
发布时间:2020-12-17 17:52:53 所属栏目:安全 来源:网络整理
导读: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); } }}) 在这
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(....) }); 显然这不是正确的方法, 解决方法
更新:在角度1.2应用程序中模拟setInterval的正确方法是使用angular的$interval服务.使用$interval服务提供了许多好处,但在这种情况下最常用的是$interval.flush()方法.在编写测试时,$interval公开了一个.flush()方法,它允许你模拟JS时钟.
app.directive('shuffleBlocks',function($timeout,$interval){ return { link: function(sco,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的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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |