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)'); 
     }); 
    }); 
}); 

控制檯日誌輸出「叫」從來沒有發生,顯然在我的測試規範elem從來沒有更新。

我在做什麼錯?

+0

我想通了......我忘了將我的指令添加到我的karma.config文件中的文件數組。 :S – mcottingham 2014-09-02 20:04:12

回答

3

原來,我沒有在我的karma.config文件中包含指令:S。添加它解決了我所有的問題。

2

你可以嘗試兩件事。

首先,不是隻使用字符串tpl,而是嘗試angular.element()。

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

其次,將tpl放在beforeEach塊中。所以結果應該是這樣的:

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(); 
}));