Каждая (синхронизация) функция из определенных файлов блокирует тесты

#angular #unit-testing

Вопрос:

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

Я использую по крайней мере 2 функции: Checkbox() (пользовательский валидатор) и getRealCheckedValues() (которые возвращают реальные значения formcontrol для управления флажками)

Я импортирую их вот так:

 import { atLeastOneCheckbox, getRealCheckedValues } from '@core/validators/validators.service';
 

А вот содержание файла:

 import { ValidatorFn, FormGroup, FormControl, Validators } from '@angular/forms';

/**
 * Validators that require at least x checkbox checked
 * @param minRequired Number of checkbox required
 */
export function atLeastOneCheckbox(minRequired = 1): ValidatorFn {
  return function validate(formGroup: FormGroup) {
    let checked = 0;

    if (!formGroup.controls) {
      return null;
    }

    Object.keys(formGroup.controls).forEach((key) => {
      const control = formGroup.controls[key];

      if (control.value) {
        checked  ;
      }
    });

    if (checked < minRequired) {
      return {
        requireCheckboxToBeChecked: true,
      };
    }

    return null;
  };
}

/**
 * Return the real values of checked checkbox
 * @param aChecked FormArray values
 * @param aValues  Checkbox values
 */
export function getRealCheckedValues(aChecked: boolean[], aValues: any[]): any[] {
  return aValues.filter((val: any, index: number) => aChecked[index]);
}

// custom validator to check that two fields match
export function MustMatch(controlName: string, matchingControlName: string) {
  return (formGroup: FormGroup) => {
    const control = formGroup.controls[controlName];
    const matchingControl = formGroup.controls[matchingControlName];

    if (matchingControl.errors amp;amp; !matchingControl.errors.mustMatch) {
      // return if another validator has already found an error on the matchingControl
      return;
    }

    // set error on matchingControl if validation fails
    if (control.value !== matchingControl.value) {
      matchingControl.setErrors({ mustMatch: true });
    } else {
      matchingControl.setErrors(null);
    }
  };
}
 

И мой тестовый блок здесь:

 this.form = this.formBuilder.group({
      // Response grids section
      grids: this.formBuilder.group({
        respGrid: this.formBuilder.array(grids), atLeastOneCheckbox(1))
      }),
    })
 

И здесь (каждое значение, используемое внутри функции, исправляется):

 const selectTransportationType = getRealCheckedValues(
      this.f.informations.controls.transportationType.value,
      this.aSubcontracts.map((sub: SubcontractData) => sub.key)
    );
 

Даже если я попытаюсь утешить.войдите прямо в функцию, журнал никогда не вызывается, и я не понимаю, почему.

Если кто-нибудь может просветить меня, пожалуйста

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

1. respGrid: this.formBuilder.array(grids), atLeastOneCheckbox(1)) эта строка не кажется мне правильным синтаксисом JS.

2. @Цветанганев как бы ты это написал ? Я не вижу, что не так с этой строкой

3. Когда я вставляю его в свой редактор кода, возникают синтаксические ошибки. Я бы сначала починил их, прежде чем что-то делать.

4. @TsvetanGanev спасибо за вашу помощь, но синтаксической ошибки нет

Ответ №1:

Ладно, значит, я нашел проблему. Все функции из этого файла были не определены, потому что путь использует псевдоним, который не работает при тестировании «@core», и я не знаю, почему. Но замените «@core» на «@app/core» исправьте проблему в моем случае.