Unit testing 如何在karma angularjs中单元测试setInterval app.directive('shuffleBlocks',函数($timeout){ 返回{ 链接:功能(sco、ele、att){ if(itemCnt

Unit testing 如何在karma angularjs中单元测试setInterval app.directive('shuffleBlocks',函数($timeout){ 返回{ 链接:功能(sco、ele、att){ if(itemCnt,unit-testing,angularjs,angularjs-directive,setinterval,karma-runner,Unit Testing,Angularjs,Angularjs Directive,Setinterval,Karma Runner,更新:在angular 1.2+应用程序中模拟setInterval的正确方法是使用angular的$interval服务。使用$interval服务提供了许多好处,但在这种情况下最常用的方法是$interval.flush()方法。在编写测试时,$interval会公开一个.flush()方法,该方法允许您模拟JS时钟 var elem = '<div shuffle-blocks><div>'; elem = mockCompile(e

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

        var elem = '<div shuffle-blocks><div>';
        elem = mockCompile(elem)(rootScope.$new());
        setInterval(function(){
            expect(......).toBe(....)
        });
我看到的唯一问题是你的
triggerEvent()
函数是你的链接函数的本地函数,所以我不知道你如何才能找到它来模拟它。但希望这能为你指明正确的方向。如果不是,对不起,我试过了


更新:模拟时钟的语法在
Jasmine 2.0
中已更改。如果您使用的是2.0,请参阅更新的文档。

angular(1.2.0-rc3)的最新版本有一个$interval服务,它使测试此类功能变得更容易。请看最肯定的一点。总是有点遗憾,仅仅为了测试而不得不破坏封装,但在许多情况下,使某些东西自动可测试使其灵活/可配置/可扩展。Jasmine 2.0中的语法更改:好主意。我更新了我对incl的响应2.0版的文档。
        var elem = '<div shuffle-blocks><div>';
        elem = mockCompile(elem)(rootScope.$new());
        setInterval(function(){
            expect(......).toBe(....)
        });
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(....);
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();
});