如何为运行块中的interval编写angularjs单元测试

如何为运行块中的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:

我正在为$interval编写单元测试。代码如下所示: 模块('serviceInvoker',[])

测试代码如下所示:

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(...),