如何为运行块中的interval编写angularjs单元测试
我正在为$interval编写单元测试。代码如下所示: 模块('serviceInvoker',[]) 测试代码如下所示:如何为运行块中的interval编写angularjs单元测试,angularjs,unit-testing,jasmine,intervals,Angularjs,Unit Testing,Jasmine,Intervals,我正在为$interval编写单元测试。代码如下所示: 模块('serviceInvoker',[]) 测试代码如下所示: describe('serviceInvoker', function() { beforeEach(module('serviceInvoker')); beforeEach(module(function($provide) { $provide.value('DateTimeFormatter', { DayHoursFormat: 'HH:
describe('serviceInvoker', function() {
beforeEach(module('serviceInvoker'));
beforeEach(module(function($provide) {
$provide.value('DateTimeFormatter', {
DayHoursFormat: 'HH:mm'
});
$provide.value('serviceSuccessFunc', jasmine.createSpy());
$provide.value('serviceErrorFunc', jasmine.createSpy());
}));
var $interval;
beforeEach(inject(function (_$rootScope_, _$interval_, _serviceSuccessFunc_, _serviceErrorFunc_) {
$rootScope = _$rootScope_;
scope = $rootScope.$new();
$interval = _$interval_;
serviceSuccessFunc = _serviceSuccessFunc_;
serviceErrorFunc = _serviceErrorFunc_;
}));
describe("loadData function ", function () {
it("should expose loadData function to $rootScope", function () {
expect(angular.isFunction($rootScope.loadData)).toBe(true);
});
it("should be called", inject(function($http) {
spyOn($rootScope, 'loadData');
$rootScope.loadData('service', 'data');
expect($rootScope.loadData).toHaveBeenCalledWith('service', 'data');
}));
});
describe("autoRefresh function ", function () {
it("should expose autoRefresh function to $rootScope", function () {
expect(angular.isFunction($rootScope.autoRefresh)).toBe(true);
});
it("should be called", function() {
var $intervalspy = jasmine.createSpy('$interval', $interval);
spyOn($rootScope, 'autoRefresh').and.callThrough();
$rootScope.autoRefresh('service', 'data','interval');
expect($rootScope.autoRefresh).toHaveBeenCalledWith('service', 'data', 'interval');
expect($intervalspy).toHaveBeenCalled();
// expect($intervalspy).toHaveBeenCalledWith(jasmine.any(Function), 1000);
});
});
}))
但是interval有一个错误:error:应该调用spy$interval
我不知道如何为函数(在运行块中)内部的interval编写单元测试,有人能给我一些帮助吗?
$intervalspy
除了测试本身之外,其他地方都没有使用。它不叫
与任何其他经过测试的服务一样,$interval
应该被监视、模拟或存根。它可以被类似的装饰师监视,而存根更简单:
beforeEach(() => {
module({ $interval: jasmine.createSpy() })
});
...
$rootScope.autoRefresh('service', 'data', 'interval');
expect($interval).toHaveBeenCalledWith(jasmine.any(Function), 'interval');
expect($rootScope.loadData).not.toHaveBeenCalled(),
var intervalCallback = $interval.calls.first().args[0];
intervalCallback();
expect($rootScope.loadData).toHaveBeenCalledWith(...),
非常感谢,但我不明白是什么:beforeach(()=>{module({$interval:jasmine.createSpy()}});我应该在哪里定义它?我对angularjs是新手。谢谢您应该在每个块之前将其定义在与其他块相同的位置。像这样吗?beforeach(注入(函数($rootScope,$interval,servicesuccesfunc,serviceserrorfunc){$rootScope=$rootScope;scope=$rootScope.$new();$interval=$interval;servicesuccesfunc=servicesuccesfunc;serviceserrorfunc=serviceserrorfunc;$interval=jasmine.createSpy();});before带有
模块的每个块应位于带有注入的块之前。在每个(模块(…)
块之前,您已经有了。你可以在那里再加一个。
beforeEach(() => {
module({ $interval: jasmine.createSpy() })
});
...
$rootScope.autoRefresh('service', 'data', 'interval');
expect($interval).toHaveBeenCalledWith(jasmine.any(Function), 'interval');
expect($rootScope.loadData).not.toHaveBeenCalled(),
var intervalCallback = $interval.calls.first().args[0];
intervalCallback();
expect($rootScope.loadData).toHaveBeenCalledWith(...),