AngularJs Jasmine无法在$ rootScope方法中调用$ scope方法

时间:2016-01-15 00:17:52

标签: javascript angularjs karma-jasmine

我的控制器$scope.get中有另一种方法$rootScope.search。我正在使用Karma和Jasmin编写单元测试。

当我尝试测试方法$rootScope.search时会抛出错误,我做错了什么?

代码如下:

Ctrl.js

App.controller('Ctrl', ['$scope', '$rootScope', function($scope, $rootScope){
    $scope.get = function(search){ // return some data from service };

    $rootScope.search = function(data){
        $scope.get(data);
    };
}]);

Ctrl.spec.js

describe('Ctrl', function(){
    beforeEach(module('app'));

    var $controller, $scope = {}, $rootScope = {};

    beforeEach(inject(function(_$controller_, _$rootScope_){
        $controller = _$controller_;
        $rootScope = _$rootScope_;
    }));

    describe('Data', function(){
        beforeEach(function() {
            $controller('Ctrl', { $scope:$scope, $rootScope:$rootScope});
            spyOn($scope, 'get');
        });

        it('$rootScope.search', function(){
            $rootScope.search();
            expect($scope.get).toHaveBeenCalled();
        });
    })
});

错误

TypeError: $scope.get is not a function at Scope.$rootScope.search

请帮忙。

1 个答案:

答案 0 :(得分:1)

  

实际上我必须在视图中使用相同的全局方法。

如果要在$ rootScope上提供全局方法,请从.run块而不是控制器执行此操作。

App.run([$rootScope', function($rootScope){

    function get = function(search){ // return some data from service };

    $rootScope.search = get;

}]);

但建议将方法放在工厂中。

App.factory('mySearch', function(){

    function get = function(search){ // return some data from service };

    return { search: get };

});

然后在您的控制器中注入自定义搜索:

App.controller('Ctrl', ['$scope', 'mySearch', function($scope, mySearch){

    var vm = $scope;
    vm.data =  mySearch.search(data);

}]);