Angular - принуждение реактивной формы к действию в unit test

Я использую Angular v4.4.4. В компоненте после нажатия кнопки в шаблоне форма сохраняется, если действительная форма действительна. Что-то вроде (псевдокод):

public onSave(): void {
    if (this.myForm.valid) {
        this._createFoo();
    }
}

private _createFoo(): void {
    this._fooService.createItem(this.foo).subscribe(result => {
        // stuff happens...
    });
}

В соответствующем unit test мне нужно заставить форму быть действительной, чтобы я мог подтвердить, что служба вызывается. Что-то вроде этого:

it('should create Foo', () => {
    const spy = spyOn(_fooService, 'createItem').and.callThrough();
    component.foo = new Foo();
    fixture.detectChanges();
    const bookButton = fixture.debugElement.query(By.css('#bookButton'));
    expect(bookButton !== null).toBeTruthy('missing Book button');
    bookButton.triggerEventHandler('click', null);
    expect(spy).toHaveBeenCalled();
});

Это не удастся, потому что myForm никогда не устанавливается как действительный.

В этом конкретном случае я не хочу давать каждому вводу в форме значение. Мне просто нужно посмотреть и посмотреть, происходит ли подписка на услугу. Как заставить форму быть действительной?

Ответ 1

Почему бы не просто очистить список валидаторов?

// If there are any async validators
//
this.myForm.clearAsyncValidators();
// If there are any normal validators
//
this.myForm.clearValidators();
// Doing the validation on all the controls to put them back to valid
//
this.formGroup.updateValueAndValidity();

Это гарантирует, что ваша форма не имеет валидаторов, поэтому она действительна.