Angular.js:如何测试指令解析器和格式化程序?

时间:2014-11-03 13:44:50

标签: angularjs protractor karma-runner karma-jasmine

我已经实现了一个简单的指令来检查用户名(它应该与正则表达式相匹配,还有一些更多的约束;在模糊时它是大写的)。
这是我目前的实施:

app.directive('checkUserName', function() {
  return {
    require: 'ngModel',
    scope: {
      value: '=ngModel'
    },
    link: function(scope, elm, attrs, model) {
      var USERNAME_REGEXP = /^[^_.$\[\]#\/][^.$\[\]#\/]*$/;
      model.$parsers.unshift(function(viewValue) {
        var user;
        var retval;
        if (!viewValue) {
          model.$setValidity('required', false);
          retval = null;
        }
        if (USERNAME_REGEXP.test(viewValue)) {
          if (!user) {
            model.$setValidity('taken', true);
            model.$setValidity('invalid', true);
            retval = viewValue;
          } else {
            model.$setValidity('taken', false);
            model.$setValidity('invalid', true);
          }
        } else {
          model.$setValidity('taken', true);
          model.$setValidity('invalid', viewValue === '');
          retval = viewValue;
        }
        return retval;
      });
      model.$formatters.push(function(modelValue) {
        if (modelValue) {
          modelValue = capitalize(modelValue);
        }
        return modelValue;
      });
    }
  };
});

app.directive('renderOn', function() {
  return {
    require: 'ngModel',
    restrict: 'A',
    link: function(scope, elm, attrs, ctrl) {
      var event = attrs.renderOn;
      elm.bind(event, function() {
        var viewValue = ctrl.$modelValue;
        for (var i in ctrl.$formatters) {
          viewValue = ctrl.$formatters[i](viewValue);
        }
        ctrl.$viewValue = viewValue;
        ctrl.$render();
      });
    }
  };  
});

function capitalize(text) {
  return text.charAt(0).toUpperCase() + text.slice(1);
}

所以问题是:
我该如何测试?
我确实用我写过的业力测试设置了fiddle,但模糊处理显然是错误的......

第二个问题是:在实现“解析”和“格式化”指令时,这是“拆分”实现(checkUserName + renderOn)的可行策略吗?

0 个答案:

没有答案