AngularJS+;因果报应+;Jasmine-测试私有函数

AngularJS+;因果报应+;Jasmine-测试私有函数,angularjs,jasmine,karma-runner,Angularjs,Jasmine,Karma Runner,我正在尝试测试一个函数,它是一个私有函数,并且它在我的控制器中的其他函数中被调用。当我尝试测试这个validateParameterGroup函数时,它给出了一个错误,表明validateParameterGroup没有定义 控制器 angular.module('PpmApp') .controller('parameterGroupListController', ['$scope', '$injector', 'parameterGroups', parameterGroupListCon

我正在尝试测试一个函数,它是一个私有函数,并且它在我的控制器中的其他函数中被调用。当我尝试测试这个validateParameterGroup函数时,它给出了一个错误,表明validateParameterGroup没有定义

控制器

angular.module('PpmApp')
.controller('parameterGroupListController', ['$scope', '$injector', 'parameterGroups', parameterGroupListController]);

  function parameterGroupListController($scope, $injector, parameterGroups) {
    $scope.createParameterGroup = function (parameterGroup) {
      var validationErrors = validateParameterGroup(parameterGroup);
    }
    function validateParameterGroup(parameterGroup) {
     // ...
    }
};
测试用例

describe('validateParameterGroup', function () {
  beforeEach(function () {
    var parameterGroup = {};
  });
  it('should validate a parameter group', function () {
   expect(validateParameterGroup(parameterGroup)).toEqual(false);
  });
 });
================编辑==================

如果无法测试私有函数,我可以测试$scope.createParameterGroup吗?我试图这样做,但我得到以下错误

TypeError:$scope.createParameterGroup(…)不是函数

测试

describe('createParameterGroup', function() {
  var validationErrors, parameterGroup;
  beforeEach(function() {
    validationErrors = {};
    validationErrors.isError;
    parameterGroup = {
      GroupName: "ABC",
      Description: "ABC",
      fromMonth: 1,
      fromYear: 18,
      toMonth: 12,
      toYear: 18
    }
  });

  it('should create a parameter group', function() {
    expect($scope.createParameterGroup(parameterGroup)(validationErrors.isError)).toEqual(false);
  });
});

是的,
validateParameterGroup
变得完全私有,无法从外部访问。您可以扩展
$scope
对象以包含此函数,使其成为公共函数,类似于
createParameterGroup

angular.module('PpmApp')
.controller('parameterGroupListController', ['$scope', '$injector', 'parameterGroups', parameterGroupListController]);

  function parameterGroupListController($scope, $injector, parameterGroups) {
    $scope.createParameterGroup = function (parameterGroup) {
      var validationErrors = validateParameterGroup(parameterGroup);
    }

    $scope.validateParameterGroup = function(parameterGroup) {
     // ...
    }
};

是的,
validateParameterGroup
变得完全私有,无法从外部访问。您可以扩展
$scope
对象以包含此函数,使其成为公共函数,类似于
createParameterGroup

angular.module('PpmApp')
.controller('parameterGroupListController', ['$scope', '$injector', 'parameterGroups', parameterGroupListController]);

  function parameterGroupListController($scope, $injector, parameterGroups) {
    $scope.createParameterGroup = function (parameterGroup) {
      var validationErrors = validateParameterGroup(parameterGroup);
    }

    $scope.validateParameterGroup = function(parameterGroup) {
     // ...
    }
};


你能给我看一下整个控制器吗?@zooly我已经更新了代码,请看一下这就是我的想法!请参阅VadimB答案,您的函数未链接到
$scope
,它是私有的,因此Karma无法访问。但将函数公开似乎不是一个解决方案。有其他选择吗?老实说,我不知道,也许可以把它绑定到
这个
。你不能做
$scope.validateParameterGroup(…)
?你能显示entiere控制器吗?@zooly我已经更新了代码,请看一下这就是我的想法!请参阅VadimB答案,您的函数未链接到
$scope
,它是私有的,因此Karma无法访问。但将函数公开似乎不是一个解决方案。有其他选择吗?老实说,我不知道,也许可以把它绑定到
这个
。您不能执行
$scope.validateParameterGroup(…)
?有其他选择吗?由于我不习惯将validateParameterGroup函数设置为公共函数。您需要将smth设置为公共函数,因此可以将
validateParameterGroup
validate
之类的函数包装在一起,并将其设置为公共函数。像
scope.validate=function(params){return validateParameterGroup(params)}
然后模拟整体
validate
如果我测试$scope.createparameterGroup函数并通过这样做将自动测试我的validateParameterGroup函数,我已经发布了上述问题的解决方案。还有别的选择吗?由于我不习惯将validateParameterGroup函数设置为公共函数。您需要将smth设置为公共函数,因此可以将
validateParameterGroup
validate
之类的函数包装在一起,并将其设置为公共函数。像
scope.validate=function(params){return validateParameterGroup(params)}
然后模拟整体
validate
如果我测试$scope.createparameterGroup函数并通过这样做将自动测试我的validateParameterGroup函数,我已经发布了上述问题的解决方案。