2017-05-29 18 views
2

私は、目的の結果が返されるまで、またはタイムアウト時間に達するまで、APIをポーリングする機能を持っています。私はpollStatus()関数を実行し、それが一度それを呼び出すために取得するのgetStatus()関数は、時間などの正確な数と呼ばれてきたが、私はイベントできないようにしたい私のテストで単体テストObservable.interval

// sample poll, filter and timeout 
    pollStatus =(): Observable<string> => { 
      return Observable.interval(1000) 
       .mergeMap(() => this.getStatus(); // this makes a http call to a status api 
       .map((response) => response.json()) 
       .filter((responseData) => responseData.status !== 'PENDING') 
       .take(1) 
       .map((response) => response.status) 
       .catch((error) => Observable.throw({message: 'FAILED'})) 
       .timeout(5000); 
      }; 

。 Observable.intervalをテストする最良の方法は何ですか?また、新しい間隔を強制的に発生させる方法はありますか?

+0

Angularの内部にいる場合、AngularのfakeAsyncとtickユーティリティを使用する必要があります。 –

+0

ありがとうJulia。私はfakeAsyncのアプローチで終わった – BSimpson

答えて

0

Rxコードをテストするには、VirtualTimeSchedulerを渡す必要があります。テストで時間を進めることができます。あなたはRxJs4でそれらを書かれていたようにあなたがRxJs5でテストを書くことができるのcompatパッケージ@kwonoj/rxjs-testscheduler-compatを使用することができます。

import { TestScheduler, next, complete } from '@kwonoj/rxjs-testscheduler-compat'; 

const scheduler = new TestScheduler(); 
const results = scheduler.startScheduler(
() => pollStatus(scheduler), 
    { created: 100, subscribed: 200, unsubscribed: 4000 } 
); 

彼らがいない自分の仕事のスケジュールを設定しますので、あなたは、時間ベースのオペレータに、スケジューラを渡す必要がありますデフォルトのスケジューラが、あなたが供給している1上:

pollStatus = (scheduler?:Rx.Scheduler): Observable<string> => { 
    return Observable.interval(1000, scheduler) 
    .mergeMap(() => this.getStatus(); // this makes a http call to a status api 
    .map((response) => response.json()) 
    .filter((responseData) => responseData.status !== 'PENDING') 
    .take(1) 
    .map((response) => response.status) 
    .catch((error) => Observable.throw({message: 'FAILED'})) 
    .timeout(5000, scheduler); 
}; 

次に、あなたのコードは、あなたのテストで仮想時間で実行され、あなたはそれが5000その後、遅くなる持っているthis.getStatus()のためのモックを作成し始めることができることを観察することができますあなたのtimeout()ヒットなどのようにmsです。

+0

ありがとうマーク。私はこれを行って、報告して戻します。私はそれがテストのためだけに使用されるので、スケジューラーを関数に渡すのを避ける方法がないと仮定していますか? – BSimpson

+0

あなたはhttps://github.com/tchock/RxJS-TestScheduler-Injectorのようなものを使ってスケジューラをrx関数に注入しようとすることができます –

+0

提案マークに感謝します。スケジューラで動作するようにテストを行うのは難しかった。私はちょうどfakeAsync()とtick()を使って終了しました。 – BSimpson