web-dev-qa-db-ja.com

私のメソッドがangular2で観察可能なエラーをスローするかどうかをテストするにはどうすればよいですか?

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

しかし、まだ成功していません。

入力はありますか?

ありがとう

17
Bhushan Gadekar

_Observable.throw_の問題は、実際にはエラーをスローしないことです。たとえあったとしても、内部で処理されます。 expect().toThrowErrorは、処理されず、テストまでバブルする例外のみをキャッチします。

代わりに_Observable.throw_は、エラーをonErrorコールバックに渡します。したがって、代わりにコールをサブスクライブし、コールバックでエラーを確認する必要があります

_it('..', async(() => {
  app.onSubmit().subscribe(
    () => {
      fail('expected error');
    },
    (error) => {
      expect(error).toBe('user already exist in database');
    });
}))
_
21
Paul Samsotha