AngularJS: как программно изменить состояние флажка в тесте Жасмин? - PullRequest
0 голосов
/ 26 сентября 2019

Я хочу программно снять флажок в Жасмин тестах.Вот шаблон компонента HTML:

 <input type="checkbox" ng-model="$ctrl.doNotShowAgain" ng-click="$ctrl.checkboxClicked()">

есть действительно простой класс контроллера:

import WelcomeService from './welcome.service';
import './welcome.scss';

const template = require('./welcome.html');

class WelcomeComponent {
  doNotShowAgain: boolean;

  static get $inject() {
    return ['WelcomeService'];
  }
  constructor(private welcomeService: WelcomeService) {}

  checkboxClicked() {
    if (this.doNotShowAgain) {
      this.welcomeService.doNotShowWelcomeModalAgain();
    } else {
      this.welcomeService.showWelcomeModalAgain();
    }
  }
}

export default {
  template,
  controller: WelcomeComponent
};

и его простое определение компонента:

import welcomeComponent from '../welcome/welcome.component';
angular.module('xyz',[]).component('welcome', welcomeComponent)

Имея это яесть действительно простой файл модульного теста welcome.component.spec.js

describe('Welcome Component', function() {
  ......
  beforeEach(function() {
    spyOn(welcomeService, 'doNotShowWelcomeModalAgain');
    spyOn(welcomeService, 'showWelcomeModalAgain');

    component = $compile('<welcome></welcome>')($scope);
    $scope.$digest();
  });
      it('should invoke welcomeService.doNotShowWelcomeModalAgain', function() {
        const checkbox = angular.element(component[0].querySelector('input'));
        checkbox.triggerHandler('click');
        $scope.$digest();
        expect(welcomeService.doNotShowWelcomeModalAgain).toHaveBeenCalled();
        expect(welcomeService.showWelcomeModalAgain).not.toHaveBeenCalled();
      });
 });

Вышеупомянутый тест пройден в AngularJS 1.6.X, но после перехода на 1.7.8 он начинает давать сбой.Проблемная строка - checkbox.triggerHandler ('click');который, кажется, не вызывает функцию checkboxClicked () вообще.Я пробовал другие вещи, как показано ниже, но безуспешно.

        checkbox.attr('checked', 'checked');
        checkbox.prop('checked', true);
        checkbox.triggerHandler('click');
        checkbox.triggerHandler('change');

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

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...