2016-10-02 12 views
1

をテストするので、私はサービスを持っている:に観察完了

@injectable() 
export class MyService { 
    public go() : Observable { /* does not complete returned observable */ } 
} 

を、私はその方法の観察可能な補完のためのテストを持っている:

it('should complete', inject([MyService], (s : MyService) => { 
    s.go() 
     .timeout(10, 'did not complete') 
     .subscribe(
      undefined, 
      // if observable failed on timeout, fail test 
      e => e == 'did not complete' && fail(e) 
     ); 
})); 

我々はテストが失敗することを期待もののので、それが正常に終了失敗した関数は、テストが既に終了した後に呼び出されます。

通常、我々はjasminedoneでこの問題を解決するが、私はの角度inject機能を使用したいと仮定すると思い、どのようにこれを達成することができますか?

編集:角度のasyncを使用してfakeAsyncは、これらのゾーンで許可されていない区間を、設定しようとtimeoutObservable年代として、どちらかのトリックをしませんでした。

答えて

3

doneを明示的に使用したい場合は可能ですが、injectメソッドと互換性のある方法を知りません。あなたはかかわらず、何ができることはbeforeEachinjectを取り扱う場合、またはあなただけbeforeEachで(インジェクタのように働く)テストベッド

からサービスを取得することができます。

let service; 

beforeEach(inject([MyService], (s : MyService) => { 
    service = s; 
})) 

it('...', (done) => { 
}) 

取得サービスをテストからベッド:

import { getTestBed } from '@angular/core/testing'; 

let service;  
beforeEach(() => { 
    TestBed.configureTestingModule({ 
    ... 
    }) 
    let injector = getTestBed(); 
    service = injector.get(MyService); 
}) 

it('...', (done) => { 
}) 
+0

'async'はうまくいかず、間隔を作成しようとしています(Observable.timeoutはおそらくそうです)。あなたはそれを実行するのに成功しましたか? – baryo

+0

btw、私はあなたが言及した最後のソリューションを使用して終わったし、それは動作します。 – baryo

+0

いいえ私はそれを試していない。 'async'の代わりに試してみることの1つは[' fakeAsync'](https://angular.io/docs/ts/latest/api/core/testing/index/fakeAsync-function.html)です。 'tick 'を呼び出す必要があります。ミリ秒の遅延を 'tick'メソッドに渡すことができます。多分それはうまくいくでしょう。たぶん 'async'は区間をサポートしていないかもしれません。私はおそらく 'fakeAsync'も動作しませんが、それを試すことができます –

関連する問題