单元测试角形式验证使用$ validators

时间:2016-01-28 09:46:24

标签: angularjs validation unit-testing jasmine

我的网络应用正在使用 Angular 1.4.8 。我有一个指令,使用 $ validators 验证表单输入。只有以数字5,6和9开头且包含8个数字的输入才有效。

angular
    .module('directive.customNumber', [])
    .directive('customNumber', customNumber);

function customNumber() {
    var REGEXP = /^([569][0-9]{7})/;

    return {
        require: ['ngModel', '^form'],
        link: function(scope, elm, attrs, ctrl) {
            ctrl.$validators.customNumber = function(modelValue, viewValue) {
                if(ctrl.$isEmpty(modelValue)) {
                    // consider empty models to be valid
                    return true;
                }
                return REGEXP.test(viewValue);
            };
        }
    };
}

用法:

<form name="form">
    <input type="text" name="myInput" custom-number>
</form>

现在我想使用 Jasmine 为此指令编写单元测试。这是我的测试用例:

describe('Directive', function() {
    var $scope;

    beforeEach(function() {
        module('directive.customNumber');
        inject(function($rootScope, $compile) {
            $scope = $rootScope;
            var template = '<form name="form"><input type="text" name="myInput" custom-number></form>';
            $compile(template)($scope);
            $scope.digest();
        });
    });

    it('should not accept invalid input', function() {
        var form = $scope.form;
        form.myInput.$setViewValue('abc');

        expect(form.$valid).toBeFalsy();
        expect(form.myInput.$error.mobile).toBeDefined();
    });
});

运行此命令会在此行引发错误"TypeError: Cannot set property 'customNumber' of undefined

ctrl.$validators.customNumber = function(....

我不确定为什么$validators在测试中变得不确定,但在正常环境中工作正常。即使我通过在使用前手动创建$validators对象来消除此错误,测试也会失败,因为customNumber验证程序永远不会被运行(通过日志记录知道),因此form.$valid始终为true

如何正确测试此指令?

1 个答案:

答案 0 :(得分:2)

在你的指令上ctrl是一个数组whare ctrl [0]是ngModel而ctrl [1]是formController