2017-03-11 46 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) 
} 

我不得不跑TIMERANGE單元測試(10,100)和斷言值反對。

問題是時間間隔會讓我的測試時間太長而無法運行。

如何減少時間間隔而不觸及功能本身?

我試着閱讀調度器上的文檔,但我沒有得到它。

回答

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

有幾點要注意:

  • 功能現在有四個參數。間隔和Scheduler我們需要用來通過TestScheduler

  • TestScheduler需要得到深度比較對象的方法。它將用於比較Notification對象的數組。

  • 您不能使用1000,因爲允許的最大時間爲hardcoded as 750。請注意,這只是虛擬時間,與實時無關,因此我們在此測試中使用的5050ms不一樣。我們只需要適應750的時間範圍。

  • 然後大理石測試作爲典型的大理石測試。有關更多信息,請參見https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.md。請注意,我不能使用與默認RxJS運算符相同的全局函數mocha

  • 我不得不指定也值,因爲大理石測試默認使用字符串,我需要強制整數,以確保深刻的平等。

您可以測試失敗,通過改變一個大理石值:

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

此外,您還可以看到該通知的對象是什麼將它們打印到控制檯:

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

使用RxJS 5 mocha幫手

此刻RxJS 5並未公開mocha測試助手。我實際上正在使用它在我正在處理的另一個項目中(包括生成圖表圖像)。你可以看看這裏https://github.com/martinsik/rxjs-extrapackage.json我正在使用什麼腳本。它運行良好,但設置有點難以理解。它包括下載RxJS 5歸檔文件,複製一些文件並使用couple of files進行修補。然後mocha測試的默認選項設置mocha.opts這是基於從RxJS 5原來。

2

您可以創建一個TestSchedulerVirtualTimeScheduler並將其作爲可選的第二個參數傳遞給Observable.Interval。在你的情況下,你只需在timeRange上添加一個可選的調度程序參數並傳遞值。

這些測試計劃程序允許您「傳遞時間」,而無需等待實際時間過去。

欲瞭解更多信息和示例,請參閱Testing your Rx Application

+0

對不起,我應該澄清。我正在使用rxjs 5.你知道rxjs 5的等價物嗎?您提供的鏈接是rxjs 4. – khoomeister

+0

沒有更新的文檔,但類型仍然存在。例如。 '從'rxjs/testing/TestScheduler'中導入{TestScheduler} –

3

我最近面臨同樣的問題,發現marble testing,它可以讓你寫,使計時可觀察到的測試非常容易真棒視力測試。

大理石測試摘要時間消失,測試立即運行(通過使用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 example project這兩個文件marble-testing.tstest-helper.ts

0

這對我很好:rxjs-testscheduler-compat。自述:

rxjs-testscheduler-COMPAT提供RxJS V4的測試調度接口RxJS的V5版允許現有的測試用例遷移以最小的努力以及爲某些情況下,編寫新的測試用例。