2017-01-22 1 views
0

Ich versuche Unit-Test meine Direktive, die Formulargültigkeit in Abhängigkeit von einer Controller-Variable setzen. Meine Richtlinie Code:Unit Testing Direktive mit Link mit Controller

angular.module('myModule',[]) 
 
     .directive('myDirective', function() { 
 
    return { 
 
     restrict: 'A', 
 
     link: function(scope, element, attr, ctrl) { 
 
      scope.$watch("mailExist", function(){ 
 
       if(scope.mailExist) { 
 
        ctrl.$setValidity('existingMailValidator', false); 
 
       } else { 
 
        ctrl.$setValidity('existingMailValidator', true); 
 
       } 
 
      }); 
 
     } 
 
    }; 
 
});

Wenn Komponententest dieser Richtlinie versucht, ich versuche, die Controller-Abfrage mit diesem Code zu isolieren:

describe('directive module unit test implementation', function() { 
 
    var $scope, 
 
     ctrl, 
 
     form; 
 
    
 
    beforeEach(module('myModule')); 
 
    
 
    beforeEach(inject(function($compile, $rootScope) { 
 
     $scope = $rootScope; 
 
     var element =angular.element(
 
      '<form name="testform">' + 
 
       '<input name="testinput" user-mail-check>' + 
 
      '</form>' 
 
     ); 
 
     var ctrl = element.controller('userMailCheck'); 
 
     $compile(element)($scope); 
 
     $scope.$digest(); 
 
     form = $scope.testform; 
 
    })); 
 
     
 
    describe('userMailCheck directive test', function() { 
 
     it('should test initial state', function() { 
 
      expect(form.testinput.$valid).toBe(true); 
 
     }); 
 
    }); 
 
});

Mit diesem Test erhalte ich immer noch: Kann die Eigenschaft '$ setValidity' von undefined nicht lesen das heißt, ich habe nicht wirklich einen Controller injizieren. Was ist falsch in meinem Test?

Antwort

0

Schließlich fand in der Lösung: in Code zuerst ich hinzufügen haben:

require: 'ngModel',

und modifiziert dann die Unit-Test wie folgt:

describe('directive module unit test implementation', function() { 
 
    var scope, 
 
     ngModel, 
 
     form; 
 
    
 
    beforeEach(module('myModule')); 
 
    
 
    beforeEach(inject(function($compile, $rootScope) { 
 
     scope = $rootScope.$new(); 
 
     var element =angular.element(
 
      '<form name="testform">' + 
 
       '<input name="testinput" ng-model="model" user-mail-check>' + 
 
      '</form>' 
 
     ); 
 
     var input = $compile(element)(scope); 
 
     ngModel = input.controller('ngModel'); 
 
     scope.$digest(); 
 
     form = scope.testform; 
 
    })); 
 
     
 
    describe('userMailCheck directive test', function() { 
 
     it('should test initial state', function() { 
 
      expect(form.testinput.$valid).toBe(true); 
 
     }); 
 
    }); 
 
});

und alles funktioniert in Ordnung.