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

ファクトリ: (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 は、valueerrorend 関数によって生成されます。 これら3つの関数のすべてで、オプションの options オブジェクトは必要ありません。

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

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

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

valueerror は、値またはエラーとオプションの options オブジェクトを受け取り、sendemit、または emitInTime に渡すことができる Event オブジェクトを返します。Kefirの end イベントは値を送信しないため、end はこの値を受け取りません。

send に渡す場合、options オブジェクトは無視されます。options は、emit および emitInTime (両方とも以下で説明)で、イベントを 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 を持つオプションオブジェクトを取得する必要があります。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の組み込みメソッドによって正しく処理されるため、実装でタイマーを使用していない限り、これはほとんど必要ありません。