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

AngularJs Jasmine unable to call $scope method within $rootScope method

本文关键字:方法 调用 scope rootScope Jasmine AngularJs      更新时间:2023-09-26

我的控制器中有一个方法$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

请帮忙。

实际上,我必须使用相同的视图作为全局方法。

如果要在$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);
}]);