Миграция с 1.6.x на 1.7.x Директива / проблема кармы - PullRequest
0 голосов
/ 04 сентября 2018

У меня возникли проблемы с переносом приведенного ниже теста с angularjs версии 1.6.10 на 1.7.3 ChangeLog

var invalid = [
    '#@%^%#$@#$@#.com',
    'email.example.com',
    'email@example@example.com',
    'あいうえお@example.com',
    //... etc 
];

invalid.forEach(function(email){
    it(email + ' is a valid email', function(){
        inject(function($compile, $rootScope) {
            var element = $compile('<input s2-email ng-model="value" />')($rootScope);
            $rootScope.$digest();
            expect(element).toBeValid();
            expect(element).toBePristine();
            $rootScope.$apply(function() {
                $rootScope.value = email;
            });
            expect(element).toBeInvalid();
            dealoc(element);
        });
    });
});

Ошибка:

PhantomJS 2.1.1 (Linux 0.0.0) S2 Директивы это «действительно» notallowed@example.com является действительным электронным письмом FAILED TypeError: null не является объектом (оценивает context.createDocumentFragment) buildFragment@/home/gon250user/Documents/myApp/frontend/webapp/node_modules/jquery/dist/jquery.js: 4745: 21 domManip@/home/gon250user/Documents/myApp/frontend/webapp/node_modules/jquery/dist/jquery.js: 5709: 27 append@/home/gon250user/Documents/myApp/frontend/webapp/node_modules/jquery/dist/jquery.js: 5898: 18 /home/gon250user/Documents/myApp/frontend/webapp/test/spec/directivesSpec.js:113:33 invoke@/home/gon250user/Documents/myApp/frontend/webapp/node_modules/angular/angular.js: 5121: 24 WorkFn@/home/gon250user/Documents/myApp/frontend/webapp/node_modules/angular-mocks/angular-mocks.js: 3439: 26 inject@/home/gon250user/Documents/myApp/frontend/webapp/node_modules/angular-mocks/angular-mocks.js: 3409: 46 /home/gon250user/Documents/myApp/frontend/webapp/test/spec/directivesSpec.js:108:19 inject@/home/gon250user/Documents/myApp/frontend/webapp/node_modules/angular-mocks/angular-mocks.js: 3406: 28 /home/gon250user/Documents/silverfinch/frontend/webapp/test/spec/directivesSpec.js:108:19

Пока что в документациях я нашел здесь , поэтому я попробовал это:

invalid.forEach(function(email) {
    it(email + ' is a valid email', function(){
        inject(function($compile, $rootScope, $rootElement, $document) {
            var element = $compile('<input s2-email ng-model="value" />')($rootScope);

            $rootElement.append(element);
            $document.append($rootElement);

            $rootScope.$digest();
            expect(element).toBeValid();
            expect(element).toBePristine();
            $rootScope.$apply(function() {
                $rootScope.value = email;
            });
            expect(element).toBeInvalid();
            dealoc(element);
        });
    });
});

Примечание: директива

angular.module('s2').directive('s2Email', function() {
    var EMAIL_REGEXP = /^[a-z0-9!.....*$/i;
    return {
        require: '?ngModel',
        restrict: '',
        link: function(scope, elm, attrs, ngModel) {
            function s2EmailValidator(modelValue) {
                if ((modelValue === null || modelValue === undefined || modelValue === '') || EMAIL_REGEXP.test(modelValue)) {
                    ngModel.$setValidity('s2-email', true);
                    return modelValue;
                } else {
                    ngModel.$setValidity('s2-email', false);
                    return undefined;
                }
            }
            ngModel.$parsers.unshift(s2EmailValidator);
            ngModel.$formatters.unshift(s2EmailValidator);
        }
    };
});
...