jest-kefir
用於斷言 Kefir Observables 的 Jest 外掛。
如何使用
使用 npm 安裝
npm i --save-dev jest-kefir
在測試程式碼的最上方,導入 jest-kefir
和 kefir
import Kefir from 'kefir'
import jestKefir from 'jest-kefir'
如果您未使用 ESModules,請確保您取得 default
屬性
const Kefir = require('kefir')
const {use} = require('chai')
const jestKefir = require('jest-kefir').default
在測試檔案的最上方,使用導出的工廠函式來建立擴充功能,並將其註冊到 jest
const {extensions, activate, send, stream, prop, pool} = chaiKefir(Kefir)
expect.extend(extensions)
所有導出的函式都讓您能夠與 Kefir Observables 互動,而無需將它們直接連接到真實或模擬的來源。
API
Factory: (Kefir) => PluginHelpers
預設導出是一個工廠函式,它接受應用程式的 Kefir 實例,並返回一個外掛輔助物件。這些輔助函式的說明如下。
PluginHelpers
extensions: {[key: string]: Matcher}
extensions
物件包含用於 Jest 的自訂匹配器。此物件應傳遞給 Jest 的 expect.extend
。
activate: (obs: Kefir.Observable) => void
activate
是一個簡單的輔助函式,用於開啟串流。
deactivate: (obs: Kefir.Observable) => void
deactivate
是一個簡單的輔助函式,用於關閉串流。它可以關閉使用 activate
開啟的串流。透過其他方式開啟的串流(直接呼叫 on{Value|Error|End|Any}
,使用 observe
等)需要透過其互補機制停用。
send: (obs: Kefir.Observable, values: Array<Event<T>>) => obs
send
是一個輔助函式,用於將值發射到給定的 observable 中。請注意,第二個參數是要從 observable 發射的值的陣列。Event
由 value
、error
和 end
函式產生。對於這三個函式,可選的 options
物件不是必需的。
value: (value, options: ?{ current }) => Event<Value>
error: (error, options: ?{ current }) => Event<Error>
end: (options: ?{ current }) => Event<End>
value
和 error
接受一個值或錯誤以及一個可選的 options
物件,並返回一個可以傳遞給 send
、emit
或 emitInTime
的 Event
物件。end
不接受此值,因為 Kefir 中的 end
事件不會隨之傳送值。
當傳遞給 send
時,將忽略 options
物件。options
由 emit
和 emitInTime
(兩者都在下方描述)使用,以確定事件是否應被視為 Kefir.Property
的目前事件、錯誤或結束。
stream: () => Kefir.Stream
prop: () => Kefir.Property
pool: () => Kefir.Pool
stream
、prop
和 pool
是用於建立空串流、屬性和池的輔助函式。它們可以用作模擬來源,將值傳送到其中。它們沒有其他行為。
斷言
toBeObservable
斷言預期的值是否為 Kefir.Observable
。
expect(obs).toBeObservable()
toBeProperty
斷言預期的值是否為 Kefir.Property
。
expect(obs).toBeProperty()
toBeStream
斷言預期的值是否為 Kefir.Stream
。
expect(obs).toBeStream()
toBePool
斷言預期的值是否為 Kefir.Pool
。
expect(obs).toBePool()
toBeActiveObservable
斷言預期的值是否為作用中的 observable。
expect(obs).toBeActiveObservable()
toEmit
斷言提供的 observable 是否同步發出預期的值。toEmit
接受一個要比對的值陣列,並期望它們在正確的順序中與值深度相等。
接受一個可選的回呼函式,在 observable 啟動後呼叫。這是因為在將值傳遞給 Jest 之前發射到 observable 中的值將不會發射到斷言中,除非它是 Property。
expect(obs).toEmit([value(1), error(new Error('whoops!')), end()], () => {
send(obs, [value(1), error(new Error('whoops!')), end()])
})
如果 obs
是具有目前值的 Kefir.Property
,則預期的值應取得 current: true
的 options 物件。請注意,根據 Properties 的運作方式,只有最後一個值是目前的。
send(obs, [value(1)])
send(obs, [value(2)])
expect(obs).to.emit([value(2, {current: true}), end()], () => {
send(obs, [end()])
})
這些規則也適用於 toEmitInTime
。
toEmitInTime
斷言提供的 observable 是否在一段時間內正確發射值。在幕後使用 lolex
來接管 JavaScript 的計時器,讓您可以針對發射值的時間進行斷言。預期的值應為元組陣列,其中第一個值是時間,第二個值是發射的值。
const expected = [[0, value(1)], [10, error(new Error('whoops!'))], [20, end()]]
接受一個回呼函式,該回呼函式會傳遞一個簡單的 tick
函式以及完整的 lolex
clock
。tick
會將內部計時器推進指定的毫秒數。clock
的說明文件 在此。
expect(obs).toEmitInTime(expected, (tick, clock) => {
send(obs, [value(1)])
tick(10)
send(obs, [error(new Error('whoops!'))])
tick(10)
send(obs, [end()])
})
toEmitInTime
在回呼函式之後也接受一個可選的組態物件。該物件接受以下選項
-
reverseSimultaneous: bool
:指出是否應以相反順序呼叫在同一時間排程的回呼函式。這是一個進階的使用案例,用於檢查您的實作是否處理了常見的瀏覽器錯誤。如需更多資訊,請參閱這個 問題。Kefir 的內建方法會正確處理此問題,因此除非您在實作中使用計時器,否則這大多是不必要的。