Angular2コンポーネントのユニットテストケースを作成しています。
これまでのところ、テストケースは正しく実行されています。
しかし、私は非同期呼び出しに関する問題に直面しています。
例のために。ユーザーが既に存在する場合にエラーをスローする新しいユーザーを作成する次の方法があります。
onSubmit():Observable<any> {
this._userService.saveUser(this.user).subscribe(
(response) => {
this._directoryService.getDirectoryById(this.selectedDirectory._id).subscribe(
(directory) => {
this.users = directory[0].users;
},
(error) => {
return error;
}
);
},
(error) => {
return error;
}
);
return ;
}
私のサービスでは、以下を使用してエラーをスローしています:
if (alreadyExist) {
let error = "user already exist in database";
return Observable.throw(error);
}
今、私はこのメソッドがエラーをスローすることを期待しています:
expect( function(){ app.onSubmit(); } )
.toThrow(new Error("User already exist in database"));
私の理解から、このテストケースは成功するはずですが、テストケースが失敗した後、エラーが発生しています。
例外をスローすることが期待される関数です。
私は複数の期待ブロックを試しました:
expect(app.onSubmit()).toThrowError(new Error("User already exist in database"));
しかし、まだ成功していません。
入力はありますか?
ありがとう
_Observable.throw
_の問題は、実際にはエラーをスローしないことです。たとえあったとしても、内部で処理されます。 expect().toThrowError
は、処理されず、テストまでバブルする例外のみをキャッチします。
代わりに_Observable.throw
_は、エラーをonError
コールバックに渡します。したがって、代わりにコールをサブスクライブし、コールバックでエラーを確認する必要があります
_it('..', async(() => {
app.onSubmit().subscribe(
() => {
fail('expected error');
},
(error) => {
expect(error).toBe('user already exist in database');
});
}))
_