2016-03-30 3 views
4

У меня есть рекурсивный метод, который, если установлен флаг, будет называть себя каждые пять секунд. Я пытаюсь написать тест, который шпионит за методом, вызывает его, ждет шесть секунд и затем ожидает, что метод будет вызван дважды. Мой тест завершается неудачно, так как шпион сообщает, что метод вызывается только один раз (начальный вызов).Шпионаж по рекурсивному методу углового контроллера

Я использую 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); 
}); 

Working Plunker

ответ

3

Вы должны использовать .and.callThrough() для дальнейшего выполнения функции, которые могли бы назвать себя:

Автор cha в шпионах с and.callThrough, шпион по-прежнему будет отслеживать все вызовы к нему, но, кроме того, он делегирует фактическую реализацию.

spyOn(controllerInstance, 'callMyself').and.callThrough(); 

Испытано в plunker - это работает.

Смежные вопросы