看来我的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 缺少一些特定的东西?
$interval 在 Angular-Mocks 中有一个模拟实现。
确保您使用的 Angular-Mocks 版本与您的 Angular 版本匹配。
$interval 的模拟版本有一个用于控制刻度的刷新方法。
看ngMock.$间隔 http://code.angularjs.org/1.2.0/angular-mocks.js
看到这个fiddle http://jsfiddle.net/eitanp461/98Xhr/并进行演示:
//--- 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);
});
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)