0

Моя директива:Как я могу протестировать контроллер в директиве AngularJS?

window.map.directive('dosingFrequencies', [ 
    function() { 
    return { 
     restrict: 'E', 
     scope: true, 
     templateUrl: '/views/directives/dosingFrequencies.html', 
     controller: function($scope, util) { 
console.log('here we go!'); 

     angular.extend($scope, { 
      model: createModel(), 

      addFrequency: function(med) { 
      med.frequencies.push(createFreqModel()); 
      }, 

      removeFrequency: function(med, index) { 
      med.frequencies.splice(index, 1); 
      }, 

      showTimeChecked: function(freq) { 
      if (freq.showTime) { 
       freq.prn = false; 
       freq.quantity = ''; 
       freq.quantityWhole = ''; 
       freq.quantityFrac = ''; 
       resetTimeToFirstLast(freq, this.model.facilityTimezone) 
      } 
      if (!freq.showTime) { 
       for (var z = 0; z < freq.doses.length; z++) { 
       freq.doses[z].quantity = ''; 
       freq.doses[z].quantityWhole = ''; 
       freq.doses[z].quantityFrac = ''; 
       } 
       resetTimeToAllday(freq, this.model.facilityTimezone); 
      } 
      }, 

      updateDosingForm: function(med) { 
      med.template.dosingForm = doseUnitChoices[med.med.dosingUnit] || ['', '']; 
      } 
     }); 

     } 
    }; 
    } 
]); 

Мой тест:

fdescribe('MedPickerController', function() { 
    var $scope; 

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

     var html = '<dosing-frequencies></dosing-frequencies>'; 

     inject(function($compile, $injector) { 
     var $controller, $rootScope, $httpBackend; 
     $rootScope = $injector.get('$rootScope'); 
     $httpBackend = $injector.get('$httpBackend'); 

     $httpBackend.whenGET('/views/directives/dosingFrequencies.html').respond(200); 

     $scope = $rootScope.$new(); 

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

     var controller = elem.controller(); 

     $scope.$digest(); 

     }); 
    }); 

    it('should extend the scope', function() { 
     expect($scope.model).not.toBeUndefined(); 
    }); 
}); 

Однако мой тест не пройден. console.log в моем контроллере также не выполняется. Что я делаю неправильно?

ответ

1

Сделать контроллер сам по себе. Не делайте это анонимной функцией.

Таким образом, вместо

{ 
    // ... some directive options 
    controller: function() { 
    // Your controller's logic 
    } 
} 

ли что-то подобное.

{ 
// ... some directive options 
    controller: "MedPickerController" 
} 

А затем определите свой контроллер отдельно, как и любой другой контроллер. Вы даже можете поместить их в один и тот же файл, это не имеет значения.

Затем в этот момент вы просто пишете контрольные тесты. Вам не нужно беспокоиться о том, что это директива.

+0

Нет способа сделать это как анонимную функцию? – Shamoon