W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本文檔涉及針對 RxJS 存儲庫內(nèi)部的編寫大理石測試,適用于希望幫助維護 RxJS 存儲庫的任何人。 相反,RxJS的用戶應(yīng)查看為應(yīng)用編寫大理石測試的指南。主要區(qū)別在于,在手動使用和使用 testScheduler.run(callback)幫助程序之間,TestScheduler 的行為有所不同。
“大理石測試”是使用稱為的專用 VirtualScheduler 的測試 TestScheduler
。它們使我們能夠以同步且可靠的方式測試異步操作?!按罄硎枴币呀?jīng)被 @jhusain,@headinthebox,@mattpodwysocki 和 @andrestaltz 等人的許多教義和文檔改編而成 。實際上,AndréStaltz 最初將其推薦為創(chuàng)建單元測試的 DSL,此后被更改和采用。
單元測試中已添加了輔助方法,以使創(chuàng)建測試更加容易。
hot(marbles: string, values?: object, error?: any)
-創(chuàng)建一個“熱”的可觀察對象(主題),當(dāng)測試開始時其行為就好像已經(jīng)在“運行”。一個有趣的區(qū)別是,hot
大理石允許 ^
角色發(fā)出“零幀”位置的信號。這就是開始訂閱要測試的可觀察對象的時間。cold(marbles: string, values?: object, error?: any)
-創(chuàng)建一個“冷”可觀察的對象,其可在測試開始時開始訂閱。expectObservable(actual: Observable<T>).toBe(marbles: string, values?: object, error?: any)
-計劃何時刷新 TestScheduler 的斷言。TestScheduler 將在您的茉莉花it
塊的結(jié)尾自動刷新。expectSubscriptions(actualSubscriptionLogs: SubscriptionLog[]).toBe(subscriptionMarbles: string)
-就像 expectObservable
為 testScheduler 刷新的時間安排斷言一樣。雙方cold()
并hot()
返回一個可觀察與屬性 subscriptions
類型 SubscriptionLog[]
。給 subscriptions
作為參數(shù)傳遞給 expectSubscriptions
斷言它是否匹配 subscriptionsMarbles
在給定的大理石圖 toBe()
。訂閱大理石圖與可觀察大理石圖略有不同。在下面閱讀更多內(nèi)容。hot
和 cold
在 hot
和 cold
方法中,除非將 values
參數(shù)傳遞給方法,否則在大理石圖中指定的值字符將作為字符串發(fā)出。為此:
hot('--a--b')
將發(fā)出"a"
,"b"
而
hot('--a--b', { a: 1, b: 2 })
將發(fā)出 1
和 2
。
同樣,未指定的錯誤將默認(rèn)為string "error"
,因此:
hot('---#')
將發(fā)出錯誤,"error"
而
hot('---#', null, new SpecialError('test'))` 會發(fā)出 `new SpecialError('test')
大理石語法是一個字符串,表示隨著時間發(fā)生的事件。任何大理石弦的第一個字符
始終代表“零幀”?!皫痹谀撤N程度上類似于虛擬毫秒。
"-"
時間:10個“幀”的時間流逝。"|"
complete:成功完成一個可觀察的對象。這是可觀察到的生產(chǎn)者信號 complete()
"#"
錯誤:終止可觀察值的錯誤。這是可觀察到的生產(chǎn)者信號 error()
"a"
任何字符:所有其他字符表示生產(chǎn)者信令發(fā)出的值 next()
"()"
同步分組:當(dāng)多個事件需要同步在同一幀中時,使用括號將這些事件分組。您可以通過這種方式將下一個值,完成或錯誤分組。初始位置(
確定了其值的發(fā)出時間。"^"
訂閱點:(僅熱觀測值)顯示測試的可觀測物將訂閱到該熱觀測值的點。這是可觀察到的“零幀”,在之前的每一幀^
都會為負(fù)。
'-'
或'------'
:等效于 Observable.never()
,或從不發(fā)出或完成的可觀察物
|`: 相當(dāng)于 `Observable.empty()
#`: 相當(dāng)于 `Observable.throw()
'--a--'
:一個可觀察的對象,等待 20個“幀”,發(fā)出值a
,然后永不完成。
'--a--b--|'`:在第20幀發(fā)射`a`,在第50幀發(fā)射`b`和在第80幀上,`complete
'--a--b--#'`:在第20幀發(fā)射`a`,在第50幀發(fā)射`b`和在第80幀上,`error
'-a-^-b--|'
:在熱觀測下,在第-20幀發(fā)射a
,然后在第 20幀發(fā)射b
,在第 50 幀上發(fā)射complete
。
'--(abc)-|'`:上框架20,發(fā)射`a`,`b`以及`c`,然后在框架80`complete
'-----(a|)'
:在第50幀上,發(fā)射a
和complete
。
訂閱大理石語法與常規(guī)大理石語法略有不同。它表示訂閱,并且隨著時間的推移發(fā)生取消訂閱點。該圖中不應(yīng)顯示其他類型的事件。
"-"
時間:段落的10個“幀”。"^"
訂閱點:顯示訂閱發(fā)生的時間點。"!"
取消訂閱點:顯示取消訂閱的時間點。
訂購大理石圖中,最多 應(yīng)有一個^
點,并且最多 應(yīng)有一個!
點。除此之外,該-
角色是訂閱大理石圖中唯一允許使用的角色。
'-'
或'------'
:從未發(fā)生過訂閱。
'--^--'
:訂閱發(fā)生在 20 個“幀”的時間之后,并且該訂閱并未取消訂閱。
'--^--!-'
:在第 20 幀發(fā)生了訂閱,而在第50幀未訂閱。
基本測試可能如下所示:
const e1 = hot('----a--^--b-------c--|');
const e2 = hot( '---d-^--e---------f-----|');
const expected = '---(be)----c-f-----|';
expectObservable(e1.merge(e2)).toBe(expected);
^
字符 hot
應(yīng)始終對齊。cold
觀測值或預(yù)期的觀測應(yīng)始終被相互對準(zhǔn),并與^
熱觀測的。values
何時需要。具有指定值的測試示例:
const values = {
a: 1,
b: 2,
c: 3,
d: 4,
x: 1 + 3, // a + c
y: 2 + 4, // b + d
}
const e1 = hot('---a---b---|', values);
const e2 = hot('-----c---d---|', values);
const expected = '-----x---y---|';
expectObservable(e1.zip(e2, function(x, y) { return x + y; }))
.toBe(expected, values);
x: 1 + 3, // a + c
要好得多 x: 4
。前者說明了為什么是 4,而后者則沒有。一個帶有訂閱斷言的測試示例:
const x = cold( '--a---b---c--|');
const xsubs = '------^-------!';
const y = cold( '---d--e---f---|');
const ysubs = '--------------^-------------!';
const e1 = hot( '------x-------y------|', { x: x, y: y });
const expected = '--------a---b----d--e---f---|';
expectObservable(e1.switch()).toBe(expected);
expectSubscriptions(x.subscriptions).toBe(xsubs);
expectSubscriptions(y.subscriptions).toBe(ysubs);
xsubs
與 ysubs
圖表對齊 expected
。x
同時取消 e1
釋放可觀測的冷信號 y
。
在大多數(shù)測試中,無需測試訂閱點和取消訂閱點,因為從 expected
圖中可以明顯看出或暗示該點。在那些情況下,請勿編寫訂閱聲明。在具有多個內(nèi)部訂閱者或具有多個訂閱者的冷可觀察性的測試用例中,這些訂閱斷言可能很有用。
通常,Jasmine 中的每個測試用例都寫為it('should do something', function () { /* ... */ })
。要標(biāo)記用于生成 PNG 圖的測試用例,必須使用如下 asDiagram(label)
函數(shù):
it.asDiagram(operatorLabel)('should do something', function () {
});
例如,使用 zip
,我們將編寫
it.asDiagram('zip')('should zip by concatenating', function () {
const e1 = hot('---a---b---|');
const e2 = hot('-----c---d---|');
const expected = '-----x---y---|';
const values = { x: 'ac', y: 'bd' };
const result = e1.zip(e2, function(x, y) { return String(x) + String(y); });
expectObservable(result).toBe(expected, values);
});
然后,在運行時 npm run tests2png
,將分析該測試用例,并在該文件夾中創(chuàng)建一個 PNG 文件 zip.png
(由決定的文件名 ${operatorLabel}.png
)img/
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: