【发布时间】:2015-01-24 21:05:13
【问题描述】:
我正在尝试测试我为验证输入而编写的指令,但遇到了一些问题。 指令管理的输入应包含有效的十六进制颜色值,如果用户使用无效值修改它,我想取消此修改。我的指令如下,并且按预期工作:
module.directive('colorValidate', function() {
return {
restrict: 'A',
scope: {
color: '=ngModel'
},
link: function(scope, element) {
var previousValue = '#ffffff';
//pattern that accept #ff0000 or #f00
var colorPattern = new RegExp('^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$');
element.on('focus', function() {
previousValue = scope.color;
});
element.on('blur', function() {
if (!colorPattern.test(scope.color)) {
scope.$apply(function() {
scope.color = previousValue;
});
}
else {
scope.$apply(function() {
scope.color = scope.color.toLowerCase();
});
}
});
}
};
});
下面是使用该指令的输入示例:
<input color-validate type="text" ng-model="color.color"/>
第一个问题:这种访问和修改元素的ngModel的方式正确吗?
那么我的主要问题是测试部分。以下是我编写的两个简单测试,但它们并没有真正起作用:
describe('colorValidate directive', function() {
var scope,
elem,
compiled,
html;
beforeEach(function() {
html = '<input color-validate type="text" ng-model="color.color"/>';
inject(function($compile, $rootScope) {
scope = $rootScope.$new();
scope.color = {color: '#aaaaaa'};
elem = angular.element(html);
compiled = $compile(elem);
compiled(scope);
scope.$digest();
});
});
it('should permit valid 6-chars color value', function() {
elem.triggerHandler('focus');
elem.val('#FF0000');
elem.triggerHandler('blur');
scope.$digest();
expect(elem.val()).toBe('#FF0000');
});
it('should reject non valid color values', function() {
elem.triggerHandler('focus');
elem.val('#F00F');
scope.$digest();
elem.triggerHandler('blur');
expect(elem.val()).toBe('#aaaaaa');
});
});
第一次测试成功,第二次失败,因为测试的值是“#F00F”而不是“#aaaaaa”。基本上,我的测试都没有真正修改指令处理的 ngModel 值...
【问题讨论】:
标签: angularjs unit-testing jasmine karma-runner