gpt4 book ai didi

javascript - Angular 指令中的单元测试 $formatters

转载 作者:行者123 更新时间:2023-12-04 19:46:34 27 4
gpt4 key购买 nike

我有一个简单的验证器,可以根据正则表达式检查输入:

.directive('test', function () {
return {
restrict: 'A',
require: 'ngModel',
link: function ($scope, element, attrs, ctrl) {

ctrl.$setValidity('namePattern', true);

function checkValid(name) {
console.log('checkValid executed');
if (!name || ctrl.$pristine) {
ctrl.$setValidity('namePattern', true);
return name;
}
var test = /^[A-Za-z0-9_-]+$/;
ctrl.$setValidity('namePattern', test.test(name));
return name;
}

// called when value changes via code/controller
ctrl.$formatters.unshift(checkValid);
// called when value changes in input element
ctrl.$parsers.unshift(checkValid);
}
};
});

Live example

我想对该指令进行单元测试,并具有以下内容:

function initState() {
angular.mock.module('app');
angular.mock.inject(function($compile, $rootScope, $timeout){
$scope = $rootScope.$new();

$rootScope.safeApply = function(cb) {
$timeout(function() {
$scope.$digest();
});
};

$scope.model = {
instanceName: ''
};

var tmpl = angular.element('<form name="form">' +
'<input ng-model="model.instanceName" name="instanceName" test>' +
'</form>'
);

element = $compile(tmpl)($scope);
$scope.$apply();
form = $scope.form;
});
}
beforeEach(initState);

但是,对模型的更改不会触发 checkValid。我试过直接在模型上设置一个属性:

it('should trigger a change resulting in an invalid state', function () {
$scope.model.instanceName = 'this is an invalid name';
$scope.$digest();
expect(form.instanceName.$valid).to.be.false;
});

以及在 $modelValue 上胡闹:

it('should trigger a change resulting in an invalid state', function () {
form.instanceName.$modelValue = 'this is an invalid name';
$scope.$digest();
expect(form.instanceName.$valid).to.be.false;
});

我还尝试通过 element.triggerHandler 触发 input 事件。

如何触发模型更改,以便 checkValid 通过 $formatters 运行?

(这是使用 Angular 1.2.23)

最佳答案

看起来你的指令将输入设置为有效(如果它是原始的)。对于您编写的单元测试,它始终是原始的,因为用户没有与之交互。

如果您希望指令继续保持现在的状态,那么在测试测试中您可以强制输入不是原始的:(我在这里使用 Jasmine)

it('should trigger a change resulting in an invalid state', function () {
$scope.model.instanceName = 'this is an invalid name';
form.instanceName.$pristine = false;
$scope.$digest();
expect(form.instanceName.$valid).toEqual(false);
});

这可以在 http://plnkr.co/edit/TEd91POjw9odNHSb6CQP?p=preview 上看到

由于您的指令明确假定输入对于处于原始状态的输入的模型更改有效,因此实际上我认为更有值(value)的测试是明确地测试它:

it('should ignore invalid values on a pristine input', function () {
$scope.model.instanceName = 'this is an invalid name';
form.instanceName.$setPristine();
$scope.$digest();
expect(form.instanceName.$valid).toEqual(true);
});

关于javascript - Angular 指令中的单元测试 $formatters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26496385/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com