2017-10-04 52 views
12

我正在使用Angular v4.4.4。在組件中,在模板中單擊按鈕後,表單將保存,假定反應形式有效。類似的信息(僞代碼):Angular - 強制在單元測試中使用反應形式

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

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

在相關單位的測試,我需要強制的形式是有效的,所以我可以確認該服務被調用。類似這樣的:

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從未設置爲有效。

在這種特殊情況下,我不想在表單中輸入每個輸入值。我只需要看看服務訂閱是否發生。我如何強制該表單有效?

+0

在這種情況下,您應該真的爲服務創建一個單元測試,爲組件創建一個測試,以便它們是分開的。組件測試應該給出一個有效值並檢查訂閱,並且服務測試應該確保請求正在經過 – FussinHussin

+0

在這種情況下,服務返回的值是不相關的。間諜只是確認服務被調用。服務本身在別處進行測試。 – ebakunin

+0

我明白了。是否有一個特定的原因,你不想直接把值?只是爲了節省時間? – FussinHussin

回答

3

爲什麼不只是清除驗證器列表?

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

這將確保您的表單沒有驗證器,因此是有效的。