Angularjs 茉莉花间谍$rootScope

Angularjs 茉莉花间谍$rootScope,angularjs,jasmine,rootscope,Angularjs,Jasmine,Rootscope,问题是: -使用AngularJs -给定一个已实现的服务 -试着用茉莉来测试它 以下是我的服务的外观: angular.module('app.common').service('StateInterceptor',['$state','$rootScope',function($state,$rootScope){ $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fro

问题是: -使用AngularJs -给定一个已实现的服务 -试着用茉莉来测试它

以下是我的服务的外观:

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));
});
我得到的是一条错误消息,上面说:

预计间谍$on已与…一起调用。。。布拉布拉,但从来没有 打电话来

我尝试了几乎所有的方法,比如: -在其中创建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");
结果是: “初始化运行” “之前” “之后”


奇怪!知道为什么吗?

尝试调用$broadcast for$stateChangeStart事件,它应该自动在$on中出现。

首先,非常感谢tasseKATT帮助我。他是引导我找到解决办法的人

问题是,我在这个模块中有另一个函数,当我在测试套件中使用“beforeachmoduleapp.common”注入模块时,它会立即运行

下面是另一个函数的外观:

angular.module('app.common').run(function($q,StateInterceptor,$modal){
  //stuffs, but pls notice that it injects the StateInterceptor which caused the problem!
});

所以我把它放到了另一个模块中,并将其作为另一个模块的依赖项。

尝试根据您的代码在这里复制它,它似乎可以工作:您是对的,请检查我上面的更新,这是确切的代码吗?因为有语法错误。对不起,侦听器中当然有内容。我可能删除了比我想要的更多的内容。现在检查。但我想问题是调用beforeachModuleApp.common也在初始化服务,在我将服务注入测试套件之前,代码在本节中运行。他想测试服务是否设置了事件侦听器,并不是说在激发$broadcast时调用$on。但是$broadcast正在发送事件,而$on正在收听,不是吗?