如何使用Jasmine在AngularJS中为数组函数创建单元测试

Pha*_*Tan 8 javascript unit-testing angularjs karma-jasmine

我有xf数组:var xf = []; 我有一个函数是这个数组中的一个元素和一个使用它的函数:

$scope.checkEmailValid = function () {
  var result = false;
  Iif (xf.validateEmail($scope.email, '256')) {
    result = true;
  }
  return result;
};

xf.validateUsername = function (sText) {
  var isValid = false;
  do {
    //Check for valid string.
    isValid = typeof sText === 'string';
    if (!isValid) {
      break;
    }
    //Check that each special character does not exist in string.
    for (var i = 0; i < sText.length; i++) {
      if (xf.SPECIAL_CHARS.indexOf(sText.charAt(i)) !== -1) {
        isValid = false;
        break;
      }
    }
    if (!isValid) {
      break;
    }
  } while (false);
  return isValid;
};
Run Code Online (Sandbox Code Playgroud)

但是当我运行我的规范时:

it ('checkEmail', function(){
  $controller('MyCtrl', { $scope: $scope });
  xf.validateUsername();
  spyOn(window,xf.validateUsername).and.callThrough();
});
Run Code Online (Sandbox Code Playgroud)

它出错了:

xf.validateUsername不是函数

我该怎么说呢?

Mat*_*nez 0

我不确定是否完全理解你的问题。但有一些我认为你做错了:

  • 如果 xf 它是一个全局变量,您应该模拟它,因为您正在测试控制器,而不是全局变量。
  • 如果你想检查全局变量的实际功能,请转到该karma.conf.js文件并将js文件路径添加到files选项中:

    files: [ ..., 'fx-script.js', ... ],

  • callThrough应在调用实际函数之前使用:

    it ('checkEmail', function(){ var ctrl = $controller('MyCtrl', { $scope: $scope }); spyOn(window, ctrl.xf.validateUsername).and.callThrough(); ctrl.xf.validateUsername(); });

我建议您单独测试您的controller、或全局脚本,并在需要注入依赖项或全局变量时添加模拟,这样您就可以随时service确定哪个module/失败了。script