2017-03-11 6 views
7

は例えば、私はこのような機能を持っている:rxjs 5で時間間隔を使って観測値を返す関数をテストするにはどうすればよいですか?

export function timeRange(start: number, end: number): Rx.Observable<number> { 
    return Rx.Observable.interval(1000) 
    .map(n => n + start) 
    .take(end - start + 1) 
} 

をそして私は(10、100)TIMERANGEを実行し、それに対する値をアサートユニットテストを持っていました。

問題は、時間間隔がテストを実行するには時間がかかりすぎることです。

機能自体に触れることなく時間間隔を短縮するにはどうすればよいですか?

私はスケジューラでドキュメントを読んでみましたが、私はそれを得ていませんでした。

答えて

6

は注意点がいくつかありますが、次のように、あなたの機能をテストすることができます。

const Rx = require('rxjs'); 
const chai = require('chai'); 

function timeRange(start, end, interval = 1000, scheduler = Rx.Scheduler.async) { 
    return Rx.Observable.interval(interval, scheduler) 
    .map(n => n + start) 
    .take(end - start + 1) 
} 

let scheduler = new Rx.TestScheduler(chai.assert.deepEqual); 
let source = timeRange(2, 8, 50, scheduler); 
let values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8}; 
scheduler.expectObservable(source).toBe('-----2----3----4----5----6----7----(8|)', values); 

scheduler.flush(); 

いくつかのポイントが気づか:

  • 機能は現在、4つの引数を取ります。間隔とTestSchedulerを渡すために使用する必要があるScheduler

  • TestSchedulerは、オブジェクトを比較する深いにメソッドを取得する必要があります。これはNotificationオブジェクトの配列を比較するために使用されます。

  • 許容最大時間がhardcoded as 750であるため、1000は使用できません。これはただの仮想時間であり、リアルタイムとは無関係であることに注意してください。このテストで使用している5050msと同じではありません。私たちはちょうどその内部に収まる必要があります750時間枠。

  • 次に大理石試験を代表的な大理石試験として行います。詳細については、https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.mdを参照してください。デフォルトのRxJS演算子と同じグローバルmocha関数を使用することはできません。

  • 大理石のテストではデフォルトで文字列を使用するため、値を指定する必要があり、深い等価性を保証するために整数を強制する必要があります。

あなたは、これは1本の大理石の値変更して失敗したことをテストすることができます。

let scheduler = new TestScheduler((actual, expected) => { 
    console.log('Actual:', actual, '\n\n', 'Expected:', expected); 
    chai.assert.deepEqual(actual, expected); 
}); 

:また

let values = {'2': 42, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8}; 

を、あなたがコンソールに印刷して、通知オブジェクトが何であるかを見ることができますRxJSを使用する5 mochaヘルパー

現在、RxJS 5はテストヘルパーmochaを公開していません。私は実際に(ダイアグラム画像を生成することを含めて)現在取り組んでいる別のプロジェクトでそれを実際に使用しています。ここで見ることができますhttps://github.com/martinsik/rxjs-extrapackage.json私はどのようなスクリプトを使用しています。それはうまくいきますが、セットアップは少し難解です。 RxJS 5アーカイブをダウンロードし、いくつかのファイルをコピーし、couple of filesでパッチを適用します。 mochaテストの既定のオプションは、mocha.optsで、RxJS 5のオリジナルに基づいて設定されています。

2

TestSchedulerまたはVirtualTimeSchedulerのいずれかを作成し、オプションの第2引数としてObservable.Intervalに渡します。あなたの場合は、単にオプションのスケジューラー引数をtimeRangeに追加し、その値を渡します。

これらのテストスケジューラでは、実際の時間が経過するのを待たずに「時間を過ごす」ことができます。詳細と例については

、私は最近、同じ問題に直面し、あなたが時限観察可能テストが非常に簡単に素晴らしい視覚的なテストを記述することができますどのmarble testingを発見Testing your Rx Application

+0

ごめんなさい。私はrxjs 5を使用しています。あなたはrxjs 5相当物を知っていますか?あなたが提供したリンクはrxjs 4です。 – khoomeister

+0

更新されたドキュメントはありませんが、タイプはまだあります。例えば。 'rxjs/testing/TestScheduler 'からの' {TestScheduler}のインポート –

3

を参照してください。

大理石のテストは離れて時間を抽象化し、テストは(フードの下TestSchedulerを使用することにより)即座に実行されますが、あなたはまだ、複雑なタイミングのプロセスをテストすることができます。これはあなたの構文のアイデアを与えるために、例のテストです:

it('should set up an interval',() => { 
    const expected = '----------0---------1---------2---------3---------4---------5---------6-----'; 
    expectObservable(Observable.interval(100, rxTestScheduler)).toBe(expected, [0, 1, 2, 3, 4, 5, 6]); 
}); 

これは実際にObservable.interval用からrxjs5レポから公式のユニットテストです:https://github.com/ReactiveX/rxjs/blob/master/spec/observables/interval-spec.ts

詳細はofficial documentationをチェックしてください。

実行するのは少し難しかったですが、基本的に必要なのは、marble-testing.tstest-helper.tsの2つのファイルです。marble testing example projectです。

0

これは私のためにはうまくいった:rxjs-testscheduler-compat。 READMEから:

rxjs-testscheduler-compatのはRxJSのV5バージョンにRxJSのV4のテスト・スケジューラ・インターフェースを提供し、最小の労力だけでなく、特定のケースのための新しいテストケースを書くことで、既存のテストケースを移行することができます。

関連する問題