Проблема:
– использование AngularJs
– наличие реализованного сервиса
– попытка протестировать его с помощью Jasmine
Вот как выглядит мой сервис:
angular.module('app.common').service('StateInterceptor',['$state','$rootScope',function($state,$rootScope){
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){/*stuffs*/}
}
и вот как я пытаюсь проверить, был ли вызван $rootScope.$on
:
describe("Testing StateInterceptor service", function(){
var $state, $rootScope, $scope, StateInterceptor;
beforeEach(module('app.common'));
beforeEach(inject(function($injector) {
$rootScope = $injector.get("$rootScope");
spyOn($rootScope, "$on");
$state = $injector.get("$state");
StateInterceptor = $injector.get("StateInterceptor");
}));
it("WHEN created THEN it should call '$rootScope.$on' event listener", function(){
//expect($rootScope.$on).toHaveBeenCalled(); //not working neither
expect($rootScope.$on).toHaveBeenCalledWith("$stateChangeStart", jasmine.any(Function));
});
У меня есть сообщение об ошибке, говорящее:
Ожидалось, что spy $on будет вызван с... (blabla), но он так и не был вызван.
Я пробовал почти все, например: - создание rootscope в этом было: $rootScope = $rootScope.$new();
- шпионить $rootScope.$on
вот так: spyOn($rootScope.prototype, "$on")
но ни один не работал. Кто-нибудь знает, как проверить это правильно?
Редактировать1:
исходный код, похоже, работает, поэтому я вставил сюда именно тот код, который у меня есть. Итак, мой сервис выглядит именно так:
angular.module('app.common').service('StateInterceptor',['$state','$rootScope',function($state,$rootScope){
var self = this;
self.bootstrapped = false;
self.changeStart = [];
self.init = function(){
if(!self.bootstrapped){
$rootScope.$on('$stateChangeStart',
function(event, toState, toParams, fromState, fromParams){
/*staffs*/
}
);
}
}
self.bootstrapped = true;
self.init();
return self;
}]);
Редактировать2:
Я добавил несколько console.log, чтобы увидеть, как выполняется код:
beforeEach(inject(function($injector) {
$rootScope = $injector.get("$rootScope");
spyOn($rootScope, "$on");
$state = $injector.get("$state");
StateInterceptor = $injector.get("StateInterceptor");
}));
И для кода первой строки в функции self.init:
console.log("init runs");
И результат: «инициализация выполняется» «до» «после»
Странный! Любая идея, почему это?
beforeEach(module('app.common'))
не будет инициализировать службу. Он не будет создан, пока кто-то не попросит об этом (этот экземпляр будет кэширован и использован повторно). - person tasseKATT   schedule 29.12.2014