2017-10-04 15 views
12

Używam Angular v4.4.4. W komponencie, po kliknięciu przycisku w szablonie, formularz jest zapisywany przy założeniu, że formularz reaktywny jest ważny. Coś jak (pseudo-kod):Kątowa - Wymuszanie poprawności formy reaktywnej w teście jednostkowym

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

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

W teście powiązanej jednostki muszę zmusić postać była ważna, więc mogę potwierdzić usługę jest nazywany. Coś takiego:

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(); 
}); 

Nie powiedzie się, ponieważ mojaForma nigdy nie jest ustawiona jako poprawna.

W tym konkretnym przypadku nie chcę, aby każde wejście w formularzu było wartością. Po prostu muszę obejrzeć i zobaczyć, czy występuje subskrypcja usługi. Jak mogę wymusić poprawność formularza?

+0

W takim przypadku naprawdę powinieneś stworzyć test jednostkowy dla usługi i jeden dla komponentu, aby były oddzielne. Test podzespołu powinien podać poprawną wartość i sprawdzić subskrypcję, a test serwisowy powinien upewnić się, że żądanie jest przetwarzane. – FussinHussin

+0

W tym przypadku wartość zwrócona przez usługę jest nieistotna. Szpieg właśnie potwierdza, że ​​usługa jest wywoływana. Sama usługa jest testowana w innym miejscu. – ebakunin

+0

Rozumiem. Czy istnieje konkretny powód, dla którego nie chcesz bezpośrednio wprowadzać wartości? po prostu zaoszczędzić czas? – FussinHussin

Odpowiedz

3

Dlaczego po prostu nie wyczyścić listy weryfikatorów?

// 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(); 

Zapewni to, że Twój formularz nie ma walidatorów, a więc jest ważny.

Powiązane problemy