chai-kefir
Kefir Observablesに対するアサーションを行うChaiプラグインです。
使用方法
npm を使用したインストール
npm i --save-dev chai-kefir
テストの先頭で、chai-kefir
と kefir
をインポートし、Kefir を登録します。
import Kefir from 'kefir';
import { use } from 'chai';
import chaiKefir from 'chai-kefir';
ESModulesを使用していない場合は、default
プロパティを取得してください。
const Kefir = require('kefir');
const { use } = require('chai');
const chaiKefir = require('chai-kefir').default;
テストファイルの先頭で、エクスポートされたファクトリ関数を使用してプラグインを作成し、chai
に登録します。
const { plugin, activate, send, stream, prop, pool } = chaiKefir(Kefir);
use(plugin);
エクスポートされたすべての関数は、実際のソースやモックソースに直接接続することなく、Kefir Observables と対話できます。
API
Factory: (Kefir) => PluginHelpers
デフォルトエクスポートは、アプリケーションのKefirインスタンスを受け取り、プラグインヘルパーのオブジェクトを返すファクトリ関数です。これらのヘルパーについては、以下で説明します。
PluginHelpers
plugin: (chai, utils) => void
plugin
関数は、chai-kefir
のアサーションを chai
に登録します。この関数は、chai
の use
関数に渡す必要があります。
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
は、指定されたオブザーバブルに値を発行するためのヘルパー関数です。第2のパラメータは、オブザーバブルから発行する値の配列であることに注意してください。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
オブジェクトを返します。end
はこの値を受け取らないため、Kefir の end
イベントは値を送信しません。
send
に渡す場合、options
オブジェクトは無視されます。options
は、emit
と emitInTime
(両方とも下記で説明)によって、イベントを Kefir.Property
の現在のイベント、エラー、または終了として扱うかどうかを決定するために使用されます。
stream: () => Kefir.Stream
prop: () => Kefir.Property
pool: () => Kefir.Pool
stream
、prop
、およびpool
は、空のストリーム、プロパティ、およびプールを作成するためのヘルパー関数です。これらは、値を送信するためのモックソースとして使用できます。それ以外の動作はありません。
アサーション
observable
期待値が Kefir.Observable
であるかどうかをアサートします。他のアサーションについては、observable
からチェーンすることをお勧めします。以下の property
はそれを必要とします。一貫性のために、残りのアサーションも同様にするべきです。
expect(obs).to.be.an.observable();
property
期待値が Kefir.Property
であるかどうかをアサートします。observable
とチェーンする必要があります。
expect(obs).to.be.an.observable.property();
stream
期待値が Kefir.Stream
であるかどうかをアサートします。
expect(obs).to.be.an.observable.stream();
pool
期待値が Kefir.Pool
であるかどうかをアサートします。
expect(obs).to.be.an.observable.pool();
active
期待値がアクティブなオブザーバブルであるかどうかをアサートします。
expect(obs).to.be.an.active.observable();
emit
提供されたオブザーバブルが期待値を同期的に発行するかどうかをアサートします。emit
は、照合する値の配列を受け取り、それらが正しい順序で値と深く等しいことを期待します。
オブザーバブルがアクティブ化された後に呼び出されるオプションのコールバックを受け入れます。これは、chai
に渡される前にオブザーバブルに発行された値は、プロパティでない限り、アサーションに発行されないためです。
expect(obs).to.emit([value(1), error(new Error('whoops!')), end()], () => {
send(obs, [value(1), error(new Error('whoops!')), end()]);
});
obs
が現在の値を持つ Kefir.Property
である場合、期待値は current: true
を持つオプションオブジェクトを取得する必要があります。プロパティの動作を考えると、最後の値のみが現在の値であることに注意してください。
send(obs, [value(1)]);
send(obs, [value(2)]);
expect(obs).to.emit([value(2, { current: true }), end()], () => {
send(obs, [end()]);
});
これらのルールは emitInTime
にも適用されます。
emitInTime
提供されたオブザーバブルが時間とともに正しく値を発行するかどうかをアサートします。内部的に lolex
を使用して JavaScripts のタイマーを引き継ぎ、値が発行される時間をアサートできます。期待値は、最初の値が時間、2番目の値が発行された値であるタプルの配列である必要があります。
const expected = [
[0, value(1)],
[10, error(new Error('whoops!'))],
[20, end()]
]
単純な tick
関数と完全な lolex
clock
の両方を渡すコールバックを受け入れます。tick
は、提供された ms 分だけ内部タイマーを進めます。clock
については、[こちら](https://github.com/sinonjs/lolex/#var-id--clocksettimeoutcallback-timeout)を参照してください。
expect(obs).to.emit(expected, (tick, clock) => {
send(obs, [value(1)]);
tick(10);
send(obs, [error(new Error('whoops!'))]);
tick(10);
send(obs, [end()]);
});
emitInTime
は、コールバックの後でオプションの構成オブジェクトも受け入れます。そのオブジェクトは次のオプションを受け取ります。
-
reverseSimultaneous: bool
: 同じ時間にスケジュールされたコールバックを逆の順序で呼び出すかどうかを示します。これは、実装が一般的なブラウザのバグを処理しているかどうかを確認するための高度なユースケースです。詳細については、[このissue](https://github.com/sinonjs/lolex/issues/24)を参照してください。これは、Kefir の組み込みメソッドによって正しく処理されるため、実装でタイマーを使用していない限り、ほとんどの場合必要ありません。