AngularJS макет ngChange для выбора в модульном тестировании

#angularjs #karma-jasmine

#angularjs #karma-jasmine

Вопрос:

Я хочу использовать событие onchange для поля выбора.

HTML —

 <select id="basetype" ng-model="role.baseType"
        ng-options="basePolicy"
        ng-change="populateSettingsForBaseType()">
</select>
  

Обработчик событий контроллера —

 private addBaseTypeChangeHandler(): void {
    this.$scope.populateSettingsForBaseType = () => {
      //someCode
    };
}
  

Я хочу убедиться, что обработчик события вызывается при событии обмена —

 it('should add the certificate validator', function() {
      spyOn($scope, 'populateSettingsForBaseType').and.callThrough();
      const html = '<select id="basetype" ng-change="populateSettingsForBaseType()" ng-model="model"></select>';

      const element = $compile(html)($scope);

      const elem = element.find('select').trigger('change');

      const ngModel = element.controller('ngModel');
      ngModel.$viewValue = 'full';

      $scope.$digest();
      expect($scope.populateSettingsForBaseType).toHaveBeenCalled();
    });
  

Это не работает. Каков правильный способ инициировать событие и убедиться, что обработчик вызывается из UT.

Ответ №1:

 it('should add the certificate validator', function() {
      spyOn($scope, 'populateSettingsForBaseType').and.callThrough();
      const html = '<select id="basetype" ng-change="populateSettingsForBaseType()" ng-model="model"></select>';

      const element = $compile(html)($scope);

      ̶c̶o̶n̶s̶t̶ ̶e̶l̶e̶m̶ ̶=̶ ̶e̶l̶e̶m̶e̶n̶t̶.̶f̶i̶n̶d̶(̶'̶s̶e̶l̶e̶c̶t̶'̶)̶.̶t̶r̶i̶g̶g̶e̶r̶(̶'̶c̶h̶a̶n̶g̶e̶'̶)̶

      const ngModel = element.controller('ngModel');
      ̶n̶g̶M̶o̶d̶e̶l̶.̶$̶v̶i̶e̶w̶V̶a̶l̶u̶e̶ ̶=̶ ̶'̶f̶u̶l̶l̶'̶
      ngModel.$setViewValue('full');

      $scope.$digest();
      expect($scope.populateSettingsForBaseType).toHaveBeenCalled();
    });
  

Комментарии:

1. ааа … не переменная, а метод. Глупая ошибка!