问题:
- 使用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));
});
我得到的是一条错误消息,说:
期待的间谍$被称为......(blabla),但它永远不会 调用。
我几乎尝试了所有的事情:
- 在此创建rootcope:$rootScope = $rootScope.$new();
- 以这种方式监视$rootScope.$on
:spyOn($rootScope.prototype, "$on")
但两者都没有奏效。 有人知道如何以正确的方式测试它吗?
原始代码似乎正常工作,所以我在这里粘贴了我所拥有的完全代码。 所以我的服务看起来就是这样:
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;
}]);
EDIT2:
我已经放了一些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");
结果是: 'init runs' '之前' '后'
奇怪!知道为什么会这样吗?
答案 0 :(得分:0)
尝试为“$ stateChangeStart”事件调用$ broadcast,它应自动进入$ on()。
答案 1 :(得分:0)
首先,非常感谢 tasseKATT 帮助我。他是引导我解决问题的人。
问题是我在这个模块中有另一个函数,当我在我的测试套件中使用'beforeEach(module(“app.common”))'注入模块时立即运行。
以下是其他功能的外观:
angular.module('app.common').run(function($q,StateInterceptor,$modal){
//stuffs, but pls notice that it injects the StateInterceptor which caused the problem!
});
所以我把它放到另一个模块中,并将其作为对另一个模块的依赖。