Wie kann ich simulieren Unschärfe beim testen von Direktiven in angularjs?

Das problem

Ich versuche zu testen, einige Richtlinien (code für beide unten). Einer von Ihnen ist eine "E-Mail" (genannt "epost" in den code(Norwegisch)) - Richtlinie. Die Lösung für diese Arbeit sollte für alle von Ihnen, so werde ich es halten, um diese für jetzt.

Technologien: Angularjs, Jasmine, Requirejs, (grunt & karma-Ausführung in Chrom)

Der Richtlinie überprüft E-Mail-Adressen in zwei Wege; auf Hochschalten und auf Unschärfe. Kann ich testen das Hochschalten ohne Probleme, wie Sie sehen können, in den test unten, aber ich kann nicht herausfinden, wie simulieren eine Unschärfe so bind('blur'), die in der Richtlinie ausgeführt wird.

, Was ich getan habe

Habe ich versucht zu fangen, die zusammengestellt element wie diesem:

elem    = angular.element(html);
element = $compile(elem)($scope);

Und dann in dem test, ich habe versucht, mehrere Permutationen auslösen, die die Unschärfe mit einer Konsole, nur innerhalb der bind-Funktion in der Richtlinie. Keine der unten arbeitet. Löst er nicht.

elem.trigger('blur');           
element.trigger('blur');
elem.triggerHandler('blur');
element.triggerHandler('blur');
element.blur();
elem.blur();

Ich die Injektion und setup auf dieser: Testen Sie eine benutzerdefinierte Validierung angularjs Richtlinie

Die E-Mail-Direktive in angularjs, eingewickelt in requirejs

define(function() {

var Directive = function() {

return {
  require: 'ngModel',
  link: function(scope, elem, attrs, ctrl) {
    var pattern = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/;

    elem.bind('blur', function() {
      scope.$apply(function () {
        if (!elem.val() || pattern.test(elem.val())) {
          ctrl.$setValidity('epost', true);
        } else {
          ctrl.$setValidity('epost', false);
        }
      });
    });

    ctrl.$parsers.unshift(function(viewValue) {
      if (pattern.test(viewValue)) {
        ctrl.$setValidity('epost', true);
        return viewValue;
      } else {
        return undefined;
      }
      });
    }
  };
};

return Directive;

});

Die Prüfung (mit Jasmin und requirejs)

define([
'Angular', 
'AngularMocks',
], function () {

describe('Directives', function () {

    var $scope;
    var form;

    beforeEach(module('common'));
    beforeEach(function () {

        var html = '<form name="form">';
        html += '<input type="text" id="epost" name="epost" epost="" ng-model="model.epost"/>';
        html += '</form>';

        inject(function ($compile, $rootScope) {
            $scope = $rootScope.$new();

            $scope.model = { 
                epost: null
            };

            //Compile the element, run digest cycle
            var elem = angular.element(html);
            $compile(elem)($scope);
            $scope.$digest();

            form = $scope.form;

        });
    }); 

    describe('(epost) Given an input field hooked up with the email directive', function () {

        var validEmail = '[email protected]';
        var invalidEmail = 'asdf@asdf';

        it('should bind data to model and be valid when email is valid on upshift', function () {
            form.epost.$setViewValue(validEmail);
            expect($scope.model.epost).toBe(validEmail);
            expect(form.epost.$valid).toBe(true);
        });
        });
    });
});

InformationsquelleAutor lizter | 2013-07-15

Schreibe einen Kommentar