Тестирование функции, использующей сервис Jasmine spyOnObject - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь протестировать функцию, которая инициируется нажатием кнопки

Если значение кнопки равно «Да», применить пользовательский валидатор к formGroup

Валидатору требуется параметркоторая является службой "this.stateService", которая возвращает номер "0" для этого теста.

Фактическая функция:

  onSelected(): void {
        const myFormGroup: AbstractControl = this.form.controls.fGroup;
            if (this.form.get('button').value === 'Yes') {
                myFormGroup.validator = myValidation.requireCheckboxesToBeChecked(this.stateService);
                } else {
                myFormGroup.setValidators(null);
                }
            myFormGroup.updateValueAndValidity();
    }

В файле валидатора:

static requireCheckboxesToBeChecked(stateService: StateService): ValidatorFn {
    return function validate (formGroup: FormGroup): { [key: string]: boolean } | null  {
      const checkedCount = stateService.currentCheckedCount();
      if (checkedCount === 0) {
          return  {
            'isNotChecked' : true
          };
        }
      return null;
    };
  }

Функция теста:

import { myValidation } from '@app/shared/validators/modification.validator';

const mockStateService = jasmine.createSpyObj('StateService',
    [ 'getCategoryState',
      'getCheckedCount'
    ]);

  it('should add validation to my form group when value is Yes', () => {

    const vehicleModificationsFormGroup = component.form.controls['vehicleModifications'];

    component.form.get('button').setValue('Yes');
    component.onSelected();

    myFormGroup.validator = myValidation.requireCheckboxesToBeChecked(mockStateService);
    expect(mockStateService.currentCheckedCount).toEqual(0);
    expect(myFormGroup.validator.length).toBe(1);
  });

Я получаю сообщение "stateService.currentCheckedCount is not function", которое находится в файле валидатора

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019
Ответ

@ stp18 поставил меня на правильный путь, функция отсутствовала в массиве

Однако мне пришлось изменить вызов mockService, чтобы он возвращал значение, а не равнялось

    import { myValidation } from '@app/shared/validators/modification.validator';

    const mockStateService = jasmine.createSpyObj('StateService',
             [ 'currentCheckedCount',
               'getCheckedCount'
             ]);

    it('should add validation to my form group when value is Yes', () => {

    const vehicleModificationsFormGroup = component.form.controls['vehicleModifications'];

    component.form.get('button').setValue('Yes');
    component.onSelected();

    myFormGroup.validator = myValidation.requireCheckboxesToBeChecked(mockStateService);
    mockStateService.currentCheckedCount.and.returnValue(0);
    expect(myFormGroup.validator.length).toBe(1);
  });
0 голосов
/ 20 февраля 2019

Определяемый вами макет (mockStateService) не имеет метода currentCheckedCount.

В mockStateService есть только два метода getCategoryState и getCheckedCount.

Если вы хотите смоделировать только некоторые методы объекта, вы можете попробовать spyOn на экземпляре ExampleService.

И так далее, есть другие варианты шпионить / издеваться над некоторыми методами.

Вы также можете попытаться определить, что вы хотите вернуть, используя createSpyObj:

const mockStateService = jasmine.createSpyObj('StateService',  
    { 
       getCategoryState: function() {
          return "ifItMathersReturnSomething";
       },
       getCheckedCount: function() {
          return "anotherThing";
       },
       currentCheckedCount: function() {
          return 0;
       } 
   }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...