У меня есть рекурсивный метод, который, если установлен флаг, будет называть себя каждые пять секунд. Я пытаюсь написать тест, который шпионит за методом, вызывает его, ждет шесть секунд и затем ожидает, что метод будет вызван дважды. Мой тест завершается неудачно, так как шпион сообщает, что метод вызывается только один раз (начальный вызов).Шпионаж по рекурсивному методу углового контроллера
Я использую Angular style guide, поэтому прикрепляю эти методы к заполнителю для this
. Я подозреваю, что может возникнуть проблема с просмотром контроллера, возвращаемого с угловых макетов $controller()
, но я не уверен, что большинство людей прикладывают методы к $scope
.
Без применения методов к $scope
, как я могу создать шпион, чтобы проверить, что мой метод был вызван дважды?
app.js:
'use strict';
angular
.module('MyApp', [
//...
]);
angular
.module('MyApp')
.controller('MyController', MyController);
MyController.$inject = [
//...
];
function MyController() {
var vm = this;
vm.callMyself = callMyself;
vm.flag = false;
function callMyself() {
console.log('callMyself');
if (vm.flag) {
console.log('callMyself & flag');
setTimeout(vm.callMyself, 5000);
}
}
}
appSpec.js:
describe('MyController', function() {
var $scope;
beforeEach(function() {
module('MyApp');
});
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
controllerInstance = $controller('MyController', {$scope: $scope});
}));
it('should call itself within 6 seconds if flag is true', function (done) {
controllerInstance.flag = true;
spyOn(controllerInstance, 'callMyself');
controllerInstance.callMyself();
setTimeout(function() {
expect(controllerInstance.callMyself).toHaveBeenCalledTimes(2);
done();
}, 6000);
}, 7000);
});