2017-10-04 3 views
12

私は角度v4.4.4を使用しています。あるコンポーネントでは、テンプレート内のボタンをクリックすると、リアクティブフォームが有効であると仮定してフォームが保存されます。 (擬似コード)のようなもの:角度 - 反応したフォームをユニットテストで有効にすることを強制する

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

これにより、フォームにバリデータがないことが保証され、有効です。

関連する問題