2016-10-24 5 views
9

私はangle2コンポーネント用のユニットテストケースを作成しています。私のメソッドが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")); 

は、このテストケースは成功するはずですが、私のテストケースが失敗した後、私はエラーの下に取得しています:

Expected function to throw an exception.

私は、複数のブロックを期待してみました:

expect(app.onSubmit()).toThrowError(new Error("User already exist in database")); 

が、それでもすべての成功を得ていません。

任意の入力?およそObservable.throw

おかげ

答えて

11

ことは、それが実際にどのエラーをスローしないということです。たとえそれがあったとしても、それは内部的に処理されるでしょう。 expect().toThrowErrorは、ハンドルではなく、テストにバブルする例外をキャッチします。

Observable.throwは、エラーをonErrorコールバックに渡します。それでは、あなたが代わりにやるべきことは、コールを購読し、これを試してみました

it('..', async(() => { 
    app.onSubmit().subscribe(
    () => { 
     fail('expected error'); 
    }, 
    (error) => { 
     expect(error).toBe('user already exist in database'); 
    }); 
})) 
+0

コールバックでエラーをチェックしている...しかし、その私のインスタンス変数の一つがundefined..thoughtである私はアプリとしてそれを初期化していると言って。 edit = false.errorは: '未定義のプロパティ編集を読むことができません.'です。 @peeskillet –

+0

あなたは問題を再現する_complete、minimal_ testを投稿できますか? –

関連する問題