У меня есть директива, которая имеет свойство формы.Директива помещается на кнопку отправки формы и прослушивает события нажатия.Когда нажимается кнопка отправки, директива проверяет, является ли форма действительной, и предотвращает всплывающее событие click для обработчика ngSubmit
, если это не так.Кроме того, каждый элемент управления формы помечается как грязный, поэтому сообщения проверки отображаются.
Директива работает нормально, и я хотел бы добавить модульные тесты, но я не могу понять, как настроить форму, содержащую кнопку отправки.,Пока это мой тест, но я не могу понять, как связать NgForm
, который принимает директива, с созданной мной поддельной формой, содержащей кнопку.
describe('ValidateBeforeSubmitDirective', () => {
let fakeSubmitButtonRef: ElementRef<HTMLButtonElement>;
let fakeForm: HTMLFormElement;
beforeEach(() => {
const fakeSubmitButton = document.createElement('BUTTON') as HTMLButtonElement;
fakeSubmitButton.type = 'submit';
fakeSubmitButtonRef = new ElementRef(fakeSubmitButton);
fakeForm = document.createElement('form');
fakeForm.appendChild(fakeSubmitButton);
});
it('should bubble click event to the submit method if form is valid', () => {
//arrange
const directive = new ValidateBeforeSubmitDirective(fakeSubmitButtonRef);
directive.form = new NgForm([], []);
spyOn(directive.form, 'ngSubmit');
expect(directive.form.valid).toBe(true, 'Test has been set up incorrectly, the form should be valid for this test.');
//*** What do I need to do to link my NgForm with fakeForm? ***
//act
fakeSubmitButtonRef.nativeElement.click();
//assert
expect(directive.form.ngSubmit).toHaveBeenCalled();
});
});
Для справки, это мой код директивы:
@Directive({
selector: '[appValidateBeforeSubmit]'
})
export class ValidateBeforeSubmitDirective {
/**
* @param element This will be the element on which the directive is being used.
*/
constructor(private readonly element: ElementRef<HTMLButtonElement>) { }
@Input('appValidateBeforeSubmit')
form: NgForm;
@HostListener('click', ['$event'])
private onClick(event: Event) {
if (!this.form.valid) {
Object.keys(this.form.controls).forEach(key => {
this.form.controls[key].markAsDirty();
});
}
return this.form.valid; //if false, this will prevent the event from bubbling up to the ngSubmit handler
}
}
Используется следующим образом:
<form #componentTypeForm="ngForm" (ngSubmit)="ok()">
<button type="submit" [appValidateBeforeSubmit]="componentTypeForm">Submit</button>
</form>
Любые идеи, как я могу настроить форму в своем тесте, чтобы кнопка click
событие всплывает до обработчика ngSubmit
формы?