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
ファクトリ: (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に値を発行するためのヘルパー関数です。2番目のパラメータは、observableから発行される値の配列であることに注意してください。Event
は、value
、error
、end
関数によって生成されます。 これら3つの関数のすべてで、オプションの 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
オブジェクトを返します。Kefirの end
イベントは値を送信しないため、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
を持つオプションオブジェクトを取得する必要があります。Propertyの仕組みにより、最後の値のみが現在の値になることに注意してください。
send(obs, [value(1)])
send(obs, [value(2)])
expect(obs).to.emit([value(2, {current: true}), end()], () => {
send(obs, [end()])
})
これらのルールは、toEmitInTime
にも適用されます。
toEmitInTime
指定されたobservableが時間をかけて正しく値を発行するかどうかをアサートします。内部で lolex
を使用してJavaScriptsタイマーを制御し、値が発行される時間に対してアサートできるようにします。期待値はタプルの配列で、最初の値は時間、2番目の値は発行された値です。
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
: 同じ時間にスケジュールされたコールバックを逆の順序で呼び出す必要があるかどうかを示します。これは、実装が一般的なブラウザのバグを処理するかどうかを確認するための高度なユースケースです。詳細については、このissueを参照してください。これはKefirの組み込みメソッドによって正しく処理されるため、実装でタイマーを使用していない限り、これはほとんど必要ありません。