Javascript 在PhantomJS中使用Jasmine测试$interval
我的Javascript 在PhantomJS中使用Jasmine测试$interval,javascript,jasmine,phantomjs,Javascript,Jasmine,Phantomjs,我的间隔似乎从未触发 我有一个指令,它包含一个$interval,我想测试它。我已经删除了所有与指令相关的代码,并在其控制器中添加了此代码: window.called = 0; window.interval = $interval(function () { window.called++; console.log('interval ' + window.called); // 4 }, 10); console.log('initialized'); // 1 测试如下
间隔
似乎从未触发
我有一个指令,它包含一个$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
..
最终测试失败了。我从未在日志中看到一个
间隔。我的代码总体上有什么问题吗?还是我缺少Jasmine/PhantomJS的某些特殊功能?$interval在angular mock中有一个模拟实现。
确保您使用的角度模拟版本与您的角度版本相匹配
$interval的模拟版本有一个flush方法来控制滴答声。
看
请看下面的演示:
//--- 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);
});
});
我想补充一点,如果我将$interval()
替换为setInterval()
,它将按预期工作,因此此问题是$interval()
所特有的。