UPDATE:在 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 的人留下我之前的答案。
上一个答案:根据茉莉花文档 http://jasmine.github.io/1.3/introduction.html#section-Jasmine_Clock,你应该能够使用jasmine.Clock.useMock()
函数来模拟典型的 JavaScript 时钟并手动完成时间间隔。由于 Angular 只是包装了原生setTimeout
功能,我非常肯定它应该允许它工作,尽管我还没有测试过它。
1.3 版本的 jasmine 文档是here http://jasmine.github.io/1.3/introduction.html#section-Mocking_the_JavaScript_Clock。这是演示其工作原理的代码示例。
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()
函数是您的链接函数的本地函数,所以我不知道您如何能够访问它来模拟它。但希望这能为您指明正确的方向。如果没有,抱歉,我试过了。
UPDATE:模拟时钟的语法已更改Jasmine 2.0
。如果您使用的是 2.0,请参阅更新的文档here http://jasmine.github.io/2.0/introduction.html#section-Mocking_the_JavaScript_Timeout_Functions.