2014-02-24 61 views
13

看起来我的interval从未被触发。

我有一个指令,其中包含$interval,我想测试它。我已经删除了所有指令相关的代码,并在其反而增加控制这片:

window.called = 0; 
window.interval = $interval(function() { 
    window.called++; 
    console.log('interval ' + window.called); // 4 
}, 10); 
console.log('initialized'); // 1 

测试看起来是这样的:

describe('myDirective', function() { 
    beforeEach(module('myModule')); 
    beforeEach(function($compile, $rootScope) { 
     /* ... compile element in its own scope ... */ 
    }); 
    it('should run the interval', function() { 
     console.log(window.interval); // 2 
     waitsFor(function() { 
      console.log('tick'); // 3 
      return false; 
     }, 1000); 
    }); 
}); 

这是一个愚蠢的测试。出于调试目的,waitsFor方法实际上始终返回false。但这是我在控制台上看到的所有内容:

initialized // 1 
Object: {then: ..} // 2 
tick // 3 
tick // 3 
tick // 3 
tick // 3 
.. 

并最终测试失败。我从来没有在日志中看到一个单独的interval。我的代码一般有什么问题,或者Jasmine/PhantomJS有什么特别的东西,我错过了?

+0

我想补充一点,如果我取代'$间隔()'和'的setInterval()',它按预期工作,所以这个问题是特别是'$ interval()'。 – stackular

回答

22

$ interval在angular-mock中有一个模拟实现。 确保您使用的角度模拟版本符合您的角度版本。

$ interval的模拟版本有一个控制滴答的刷新方法。 见ngMock.$interval

看到这个fiddle具有示范:

//--- CODE -------------------------- 
angular.module('myModule', []).service('myModuleService', ['$interval', function ($interval) { 
    var called = 0; 
    $interval(function() { 
     called++; 
    }, 10); 
    this.getCalled = function() { 
     return called; 
    } 
}]); 

// --- SPECS ------------------------- 

describe('test $interval', function() { 

    it('calls the interval callback', function() { 
     var service, $interval; 
     angular.mock.module('myModule'); 
     angular.mock.inject(function (myModuleService, _$interval_) { 
      // Initialize the service under test instance 
      service = myModuleService; 
      $interval = _$interval_; 
     }); 
     expect(service.getCalled()).toEqual(0); 
     $interval.flush(11); 
     expect(service.getCalled()).toEqual(1); 
     $interval.flush(10); 
     expect(service.getCalled()).toEqual(2); 
    }); 
});