6

Я пытаюсь выполнить модульное тестирование директивы, которая использует ngModel и имеет трудности. Кажется, что функция ссылка моей директивы никогда не называют ...Углеродная директива единицы измерения, которая использует ngModel

Вот моя директива код:

coreModule.directive('coreUnit', ['$timeout', function ($timeout) { 
    return { 
     restrict: 'E', 
     require: '?ngModel', 
     template: "{{output}}", 
     link: function (scope, elem, attrs, ngModelCtrl) { 
      ngModelCtrl.$render = function() { 
       render(ngModelCtrl.$modelValue); 
      }; 
      console.log("called"); 
      function render(unit) { 
       if (unit) { 
        var output = '(' + 
         unit.numerator + 
         (unit.denominator == '' ? '' : '/') + 
         unit.denominator + 
         (unit.rate == 'NONE' || unit.rate == '' ? '' : '/' + unit.rate) + 
         ')'; 
        scope.output = output == '()' ? '' : output; 
       } 
      } 
     } 
    } 
}]); 

Вот мой тест спецификации:

describe('core', function() { 
    describe('coreUnitDirective', function() { 
     beforeEach(module('core')); 

     var scope, 
      elem; 

     var tpl = '<core-unit ng-model="myUnit"></core-unit>'; 

     beforeEach(inject(function ($rootScope, $compile) { 
      scope = $rootScope.$new(); 
      scope.myUnit = {}; 
      elem = $compile(tpl)(scope); 
      scope.$digest(); 
     })); 

     it('the unit should be empty', function() { 
      expect(elem.html()).toBe(''); 
     }); 

     it('should show (boe)', function() { 
      scope.myUnit = { 
       numerator: 'boe', 
       denominator: "", 
       rate: "" 
      }; 
      scope.$digest(); 
      expect(elem.html()).toContain('(boe)'); 
     }); 
    }); 
}); 

Консоль вывода журнала «called» никогда не происходит и, очевидно, элемент в моей тестовой спецификации никогда не обновляется.

Что я делаю неправильно?

+0

Я понял это ... Я забыл добавить свою директиву в массив файлов в моем файле karma.config. : S – mcottingham

ответ

3

Оказывается, что я не включая директиву в моем файле karma.config: S. Добавив его, я разрешил все мои проблемы.

2

Вы можете попробовать две вещи.

Во-первых, вместо использования только строки tpl попробуйте angular.element().

var tpl = angular.element('<core-unit ng-model="myUnit"></core-unit>'); 

Во-вторых, поместите tpl в блок перед первым блоком. Таким образом, результат должен выглядеть следующим образом:

beforeEach(inject(function ($rootScope, $compile) { 
    var tpl = angular.element('<core-unit ng-model="myUnit"></core-unit>'); 
    scope = $rootScope.$new(); 
    scope.myUnit = {}; 
    elem = $compile(tpl)(scope); 
    scope.$digest(); 
}));