chai-kefir

Kefir Observablesに対するアサーションを行うChaiプラグインです。

Build Status


使用方法

npm を使用したインストール

npm i --save-dev chai-kefir

テストの先頭で、chai-kefirkefir をインポートし、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 に登録します。この関数は、chaiuse 関数に渡す必要があります。

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 は、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 オブジェクトを返します。end はこの値を受け取らないため、Kefir の end イベントは値を送信しません。

send に渡す場合、options オブジェクトは無視されます。options は、emitemitInTime(両方とも下記で説明)によって、イベントを Kefir.Property の現在のイベント、エラー、または終了として扱うかどうかを決定するために使用されます。

stream: () => Kefir.Stream

prop: () => Kefir.Property

pool: () => Kefir.Pool

streamprop、および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 の組み込みメソッドによって正しく処理されるため、実装でタイマーを使用していない限り、ほとんどの場合必要ありません。