#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» исправьте проблему в моем случае.