jest-kefir

用於斷言 Kefir Observables 的 Jest 外掛。

Build Status


如何使用

使用 npm 安裝

npm i --save-dev jest-kefir

在測試程式碼的最上方,導入 jest-kefirkefir

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 發射的值的陣列。Eventvalueerrorend 函式產生。對於這三個函式,可選的 options 物件不是必需的。

value: (value, options: ?{ current }) => Event<Value>

error: (error, options: ?{ current }) => Event<Error>

end: (options: ?{ current }) => Event<End>

valueerror 接受一個值或錯誤以及一個可選的 options 物件,並返回一個可以傳遞給 sendemitemitInTimeEvent 物件。end 不接受此值,因為 Kefir 中的 end 事件不會隨之傳送值。

當傳遞給 send 時,將忽略 options 物件。optionsemitemitInTime(兩者都在下方描述)使用,以確定事件是否應被視為 Kefir.Property 的目前事件、錯誤或結束。

stream: () => Kefir.Stream

prop: () => Kefir.Property

pool: () => Kefir.Pool

streamproppool 是用於建立空串流、屬性和池的輔助函式。它們可以用作模擬來源,將值傳送到其中。它們沒有其他行為。

斷言

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 clocktick 會將內部計時器推進指定的毫秒數。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 的內建方法會正確處理此問題,因此除非您在實作中使用計時器,否則這大多是不必要的。